繁体   English   中英

C ++特殊成员函数

[英]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 ++版本中,这是一个错误 我的副本说:

如果您自己没有声明它们,那么周到的编译器将声明它们自己的副本构造函数,赋值运算符和析构函数的版本。

如您所见,这里不再提及任何地址运算符。 第二版勘误表明确提到了此更改:

没有声明运算符和函数的类不会隐式声明它们。 而是,只要将“&”应用于该类型的对象,编译器就会使用内置的地址运算符。 从技术上来说,此行为又不是全局运算符和函数的应用。 而是使用内置的运算符。

“为什么在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM