10

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

class MyClass
{
    // ...
};

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

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

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

4

2 回答 2

6

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

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

于 2011-03-21T16:39:37.117 回答
1

为什么是这样?

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

如果您被允许重载分配,大多数用途将是模棱两可的。

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

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

这两种选择都会使已经非常复杂的规则复杂化,只为operator=.

很少有人想去那里。

而且您还没有公开此功能的合法用途。

或者,任何合理的使用。

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

于 2011-12-12T01:40:44.473 回答