我一直都知道C ++的特殊成员函数是:
现在我正在阅读Meyers Effective C ++书籍,并且已经意识到还有一对地址的运营商。
我可以这样重新定义:
class A
{
public:
A* operator&()
{
std::cout << "Address of operator" << std::endl;
}
};
int main()
{
A a;
B* b = &a; // Will call address-of operator.
}
为什么然后在C ++标准第12节(特殊成员函数)中没有关于此运算符的说法。
答案 0 :(得分:3)
这应该是一个答案,而不是评论,所以就是这样:
在您的Effective C ++版中出现错误。我的副本说:
如果您没有自己申报,那么您周到的编制者会 声明自己版本的复制构造函数,赋值 运算符和析构函数。
正如您所看到的,不再提及任何地址运算符。 errata for the second edition明确提到了这一变化:
宣布没有操作员和班级的班级功能没有它们 隐含地宣布。相反,编译器使用内置地址 运营商每当“&amp;”应用于该类型的对象。这个 反过来,行为在技术上不是全球性的应用 运营商和放大器;功能。相反,它是内置运算符的使用。
答案 1 :(得分:2)
&#34;为什么然后在C ++标准第12节(特殊成员函数)中没有关于此运算符的字。 &#34;
因为此运算符不是特殊成员函数。它实际涵盖在this section
中13.5重载运算符
1具有以下operator-function-id之一的函数声明,其名称声明了一个运算符 功能。一个函数模板声明,其中包含以下operator-function-id之一作为其名称 声明一个运算符函数模板。运算符函数模板的特化也是运算符 功能。据说操作员功能实现了在其中命名的操作员 操作员功能-ID。 子>operator-function-id: operator operator operator: one of new delete new[] delete[] + - * / % ˆ & | ∼ ! = < > += -= *= /= %= ˆ= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> ( ) [ ]
...
2一元和二元形式
+
-
*
&
可以重载。
答案 2 :(得分:0)
如果您更仔细地阅读标准,您会发现特殊的成员函数是编译器可以隐式声明的那些函数,如果您不明确声明它们的话。
来自C ++标准:
12特殊成员函数[特殊] 1默认构造函数 (12.1),复制构造函数和复制赋值运算符(12.8),移动 构造函数和移动赋值运算符(12.8),以及析构函数(12.4) 是特殊的会员功能。 [注意:实施将 隐含地为某些类类型声明这些成员函数 程序没有明确声明它们。实现 如果它们被使用,它将隐含地定义它们(3.2)。见12.1,12.4 和12.8。 -end note]隐式声明的特殊成员函数 在类说明符的结束时声明。计划应 不定义隐式声明的特殊成员函数。
顺便说一下你所显示的运算符的定义是错误的,因为它什么都不返回。
对于其他成员函数(包括例如应声明为类成员的运算符),实现不会隐式声明它们。程序员决定是否声明某些运算符。例如,您的类可能包含十几个赋值运算符。