关于运营商的预定义含义的问题

use*_*983 5 c++

在"The C++ programming language"中,在265页,作者发表以下声明:

由于历史事故,运算符=(赋值),&(地址)和(序列;§6.2.2)在应用于类对象时具有预定义的含义.一般用户可以通过将其设为私有来使这些预定义含义无法访问:

然后给出以下示例:

class X {
private:
 void operator=(const X&);
 void operator&();
 void operator,(const X&);
 // ...
};

void f(X a, X b)
{
   a = b;  // error: operator= private
   &a;     // error: operator& private
   a,b;    // error: operator, private
}
Run Code Online (Sandbox Code Playgroud)

我不太明白这些"错误"评论是指什么?这是否意味着我不应该这样定义一个函数f,或者说所有的=,&,运营商应按照默认方式来使用,没有必要重新定义它们呢?

Mic*_*bus 8

这个例子简单地展示了一种方法来防止你自己或代码的其他开发人员使用运算符,这些运算符可以在没有在类中定义的情况下使用,因为它们是自动生成的(并且具有它们所代表的操作的默认含义).

这个例子的意思笔者,如果你尝试分配ba(排队a = b),它会导致一个错误,因为赋值运算符是在类定义私有.

在第二行中的address-of和第三行中的逗号运算符的情况下发生类似的错误.

如果你知道它们不应该被使用(或者还没有被实现),那么使默认运算符/构造函数成为私有是好的,因为可能会意外地使用非常频繁的运算符,如赋值或复制构造函数,而不知道它是默认的行为与类生命周期冲突.如果在类设计的最开始时将此类运算符或构造函数设为私有,则编译器将生成编译时错误,而不是执行潜在危险的操作,如果程序员意外使用该方法,则不另行通知.

想想默认赋值运算符和成员指针:它将复制指针,而您可能希望该对象是数据的所有者.然后,在某人将一个对象分配给另一个对象而不知道未实现分配之后,您将最终出现双重自由错误.而不是那样,如果运算符是私有的,你将得到一个很好的错误,代码甚至不会编译,你就会知道发生了什么.


Alo*_*ave 5

作者打算在这里指出运算符=,&并且, 通常隐含地可用于类.
因此,如果您不希望通过它们操作对象,则将它们声明为private不允许使用它们.

因为它们被声明为private你不能再在类外访问它们,编译器会给你一个编译错误.该函数是一个显示该示例的示例.