[英]C++ Special member functions
我一直都知道C ++的特殊成员函数是:
现在,我正在阅读Meyers Effective C ++书,并且意识到还存在一对address-of运算符 。
我可以这样重新定义它:
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节(特殊成员函数)中没有关于此运算符的字词。
“为什么在C ++标准第12节(特殊成员函数)中没有关于此运算符的字词。”
因为此运算符不是特殊的成员函数 。 本节实际介绍了
13.5重载的运算符
1具有以下操作员功能ID之一名称的功能声明,用于声明操作员功能。 名称为以下操作员功能ID之一的功能模板声明用于声明操作员功能模板。 操作员功能模板的特殊化也是操作员功能。 据说有一个运算符函数实现其名称中的运算符
操作功能-ID。operator-function-id: operator operator operator: one of new delete new[] delete[] + - * / % ˆ & | ∼ ! = < > += -= *= /= %= ˆ= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> ( ) [ ]
...
2
+
-
*
&
的一元和二进制形式都可以重载。
如果您更仔细地阅读《标准》,您会发现特殊成员函数是那些编译器可以在您不显式声明它们的情况下隐式声明的函数。
从C ++标准:
12特殊成员函数[特殊] 1默认构造函数(12.1),复制构造函数和复制赋值运算符(12.8),移动构造函数和移动赋值运算符(12.8)和析构函数(12.4)是特殊成员函数。 [注意: 如果程序未明确声明它们,则实现将隐式声明某些类类型的这些成员函数。 如果使用它们,则实现将隐式定义它们(3.2)。 参见12.1、12.4和12.8。 [-end note]在类说明符的结束}处声明了一个隐式声明的特殊成员函数。 程序不得定义隐式声明的特殊成员函数。
顺便说一句,您显示的运算符的定义是错误的,因为它不返回任何内容。
对于其他成员函数,包括运算符,例如应声明为类成员,则实现不会隐式声明它们。 由程序员决定是否声明某些运算符。 例如,您的班级可能包含十几个赋值运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.