gpt4 book ai didi

c++ - 关于运算符预定义含义的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:36 26 4
gpt4 key购买 nike

在“The C++ programming language”的第 265 页,作者作了如下声明:

Because of historical accident, the operators = (assignment), & (address-of), and , (sequencing; §6.2.2) have predefined meanings when applied to class objects. These predefined meanings can be made inaccessible to general users by making them private:

然后给出下面的例子:

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
}

我不太明白这些“错误”评论指的是什么?这是否意味着我不应该定义像 f 这样的函数,或者所有的 =& 运算符应该按照默认的方式使用,不需要重新定义?

最佳答案

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

该示例的作者的意思是,如果您尝试将 b 分配给 a(在行 a = b 中),它将导致一个错误,因为赋值运算符在类定义中是私有(private)的。

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

如果您知道不应该使用(或尚未实现)默认运算符/构造函数,则将它们设为私有(private)是好的,因为人们可能会不小心使用非常频繁的运算符,如赋值或复制构造函数,而没有意识到它的默认行为与类生命周期冲突。如果在类设计之初就将此类运算符或构造函数设为私有(private),则如果程序员不小心使用了该方法,编译器将生成编译时错误,而不是执行具有潜在危险的操作,而不另行通知。

考虑默认赋值运算符和成员指针:它将复制指针,而您可能希望对象成为数据的所有者。然后,在有人将一个对象赋值给另一个对象而不知道赋值没有实现之后,你将以 double free 错误告终。取而代之的是,如果运算符是私有(private)的,你会得到一个很好的错误,代码甚至不会编译,你会知道发生了什么。

关于c++ - 关于运算符预定义含义的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com