我读过一个声明为成员函数的重载运算符是不对称的,因为它只能有一个参数,而另一个自动传递的参数是'this'指针。所以没有标准来比较它们。另一方面,被声明为朋友的重载运算符是对称的,因为我们传递了两个相同类型的参数,因此可以进行比较。 我的问题是,当我仍然可以比较一个指针的左值与引用时,为什么朋友更喜欢? (使用非对称版本会得到与对称版本相同的结果) 为什么STL算法只使用对称版本?运算符重载:成员函数与非成员函数?
81
A
回答
101
如果您将运算符重载函数定义为成员函数,那么编译器会将表达式s1 + s2
转换为s1.operator+(s2)
。 这意味着,运算符重载的成员函数会在第一个操作数上被调用。这就是成员函数的工作方式!
但是如果第一个操作数不是类呢? 如果我们想要在第一个操作数不是类的类型时重载操作符,那么存在一个主要问题,而不是类型double
。所以你不能这样写10.0 + s2
。但是,您可以编写运算符重载成员函数,用于表达式如s1 + 10.0
。
为了解决这个订购问题,我们定义操作重载功能friend
如果需要访问private
成员。 只有当它需要访问私人成员时才使它成为friend
。否则干脆就让它非朋友非会员功能改进封装!
class Sample
{
public:
Sample operator + (const Sample& op2); //works with s1 + s2
Sample operator + (double op2); //works with s1 + 10.0
//Make it `friend` only when it needs to access private members.
//Otherwise simply make it **non-friend non-member** function.
friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
}
阅读这些:
A slight problem of ordering in operands
How Non-Member Functions Improve Encapsulation
14
这不一定friend
运算符重载和成员函数运算符重载,因为它是全球运算符重载和成员函数运算符重载之间的区别。
一个理由,更喜欢一个全球运算符重载是,如果你想允许式,其类类型的二元运算符的右右手边出现。例如:
Foo f = 100;
int x = 10;
cout << x + f;
这只能如果存在用于
富操作者+(INT X,常量富& F)一个全球运营商超载;
请注意,全局运算符过载不一定需要是friend
函数。这仅在需要访问Foo
的私人成员时才有必要,但情况并非总是如此。
无论如何,如果Foo
只有一个成员函数运算符重载,如:
class Foo
{
...
Foo operator + (int x);
...
};
...那么我们只能够在那里一个Foo
实例上似乎有表情离开的加运营商。
相关问题
- 1. 运算符重载(朋友和成员函数)
- 2. 作为成员函数重载*乘法运算符两次?
- 3. 成员函数vs操作符重载
- 4. 调用从const成员函数非const成员函数指针
- 5. 从const成员函数调用非const成员函数
- 6. 成员函数非对象
- 7. 非成员函数模板
- 8. 作为成员或非成员函数的算法?
- 9. 运算符==是成员函数还是朋友函数?
- 10. 将非会员非朋友函数加入到成员函数
- 11. 与非成员函数链接错误
- 12. 成员二元运算符和运算符重载中的非成员二元运算符
- 13. 成员函数
- 14. Effective C++项目23首选成员函数的非成员非朋友函数
- 15. 问题重载函数成员C++
- 16. C++重载的成员函数错误
- 17. 将运算符重载为类成员
- 18. 在非类成员函数的参数中传递类成员函数
- 19. const成员函数
- 20. 在成员函数
- 21. 成员函数和
- 22. 重载运算符<<用于成员函数中某个类的枚举成员
- 23. 如何从静态成员函数中调用非静态成员函数?
- 24. C++:成员调用非静态成员函数指针
- 25. 什么是由非成员运算符重载
- 26. 非成员运算符重载应该放在哪里?
- 27. 传递一个重载成员函数的函数指针?
- 28. 函数或方法或函数成员或方法成员?
- 29. 成员函数和const成员函数指针扣
- 30. C++分配成员的目标函数,类成员函数
你的问题实在是只有约二元运算符。并非所有重载操作符都被限制为单个参数。 ()运算符可以接受任意数量的参数。另一方面,一元运算符不能有任何参数。 – 2011-01-07 04:16:23
http://stackoverflow.com/a/4421729/103167 – 2012-02-19 01:09:23
这是[C++ FAQ:运算符重载]中涵盖的许多主题之一(http://stackoverflow.com/questions/4421706/operator-overloading) – 2012-02-19 01:09:37