重载operator =作为非成员

时间:2011-03-21 16:33:52

标签: c++ oop operator-overloading encapsulation assignment-operator

根据对this线程的回复,operator=不能作为非成员函数重载。因此,例如,以下内容使编译器非常生气:

class MyClass
{
    // ...
};

MyClass& operator=(MyClass& Left, MyClass& Right)
{
    // ...
}

这是为什么?我有一个带getter和setter的容器类,因此不需要成员函数,它会破坏封装。上述线程的答案之一是说确保“L值被接收为其第一个操作数”,但我不完全理解这意味着什么。请有人澄清一下吗?

此外,operator=operator()operator[]operator->“奇怪的”情况......?或者我应该将所有重载运算符实现为成员函数......? (我知道做其他事情是完全合法的,但我正在寻找更好的做法。)

2 个答案:

答案 0 :(得分:6)

如果你的类没有赋值运算符(作为成员),编译器默认生成一个,就像你没有提供一个复制构造函数一样。

因此,如果您稍后尝试定义非成员赋值运算符,它将“生气”。然后会有两个!

答案 1 :(得分:1)

  

这是为什么?

除非您声明一个,否则编译器会在您的班级中使用签名operator=operator= (C&, C&)声明operator= (C&, const C&)

如果您被允许超载分配,大多数用途都是不明确的。

然后您可能会游说其他规则

  • 假设没有编译器声明operator=如果用户声明一个是可见的,就像非成员operator=隐藏成员operator=
  • 在重载期间让您的用户声明分配更好地匹配。

这两种选择都会使已经非常复杂的规则复杂化,只为operator=添加一个特殊情况。

很少有人想去那里。

此外您尚未公开此功能的合法用途。

或者任何合理使用。

当可以显示一些合理的用例时,C ++规则变得更加复杂。