C++ 类中有 5 个默认成员。默认构造函数、析构函数、复制构造函数、赋值运算符和地址运算符。
什么是地址运算符?是
className* operator &() {}
吗?如果是这样,为什么编译器会默认生成这个地址运算符(因为我们在 C 中已经有了一个地址运算符,我们可以在没有额外开销的情况下获得对象的地址)?有什么特别的目的吗?
C++ 类中有 5 个默认成员。默认构造函数、析构函数、复制构造函数、赋值运算符和地址运算符。
什么是地址运算符?是className* operator &() {}
吗?
如果是这样,为什么编译器会默认生成这个地址运算符(因为我们在 C 中已经有了一个地址运算符,我们可以在没有额外开销的情况下获得对象的地址)?有什么特别的目的吗?
你是从错误的前提开始的。特殊的成员函数是 (§12 [special]/p1)
一元operator &
不是特殊的成员函数,也不存在编译器生成的operator &()
函数。如果你写
struct B {} b;
B *pb = &b;
那么使用的是内置&
运算符。不涉及函数调用或开销。它的行为就像您获取int
变量的地址一样。
有些程序员手动重载 unary operator &
。这通常是一个非常糟糕的主意。
在 C++ 标准的第 13.3.1.2 节中有关运算符重载决议的部分中,可以找到以下规则:
如果运算符是
operator ,
、一元operator &
或operator ->
,并且没有可行的函数,则假定该运算符是内置运算符并根据第 5 条进行解释。
如果默认情况下为所有类型提供了一个成员operator&
,则可行集永远不会为空。由于当可行集为空时有一个规则,因此您可以确保类型最初没有 member operator&
。