根据对this线程的回复,operator=
不能作为非成员函数重载。因此,例如,以下内容使编译器非常生气:
class MyClass
{
// ...
};
MyClass& operator=(MyClass& Left, MyClass& Right)
{
// ...
}
这是为什么?我有一个带getter和setter的容器类,因此不需要成员函数,它会破坏封装。上述线程的答案之一是说确保“L值被接收为其第一个操作数”,但我不完全理解这意味着什么。请有人澄清一下吗?
此外,operator=
,operator()
,operator[]
和operator->
“奇怪的”情况......?或者我应该将所有重载运算符实现为成员函数......? (我知道做其他事情是完全合法的,但我正在寻找更好的做法。)
答案 0 :(得分:6)
如果你的类没有赋值运算符(作为成员),编译器默认生成一个,就像你没有提供一个复制构造函数一样。
因此,如果您稍后尝试定义非成员赋值运算符,它将“生气”。然后会有两个!
答案 1 :(得分:1)
这是为什么?
除非您声明一个,否则编译器会在您的班级中使用签名operator=
或operator= (C&, C&)
声明operator= (C&, const C&)
。
如果您被允许超载分配,大多数用途都是不明确的。
然后您可能会游说其他规则:
operator=
如果用户声明一个是可见的,就像非成员operator=
隐藏成员operator=
这两种选择都会使已经非常复杂的规则复杂化,只为operator=
添加一个特殊情况。
很少有人想去那里。
此外您尚未公开此功能的合法用途。
或者任何合理使用。
当可以显示一些合理的用例时,C ++规则变得更加复杂。