C ++特殊成员函数

时间:2015-03-01 14:07:51

标签: c++ c++11 assignment-operator default-constructor

我一直都知道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节(特殊成员函数)中没有关于此运算符的说法。

3 个答案:

答案 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]隐式声明的特殊成员函数   在类说明符的结束时声明。计划应   不定义隐式声明的特殊成员函数。

顺便说一下你所显示的运算符的定义是错误的,因为它什么都不返回。

对于其他成员函数(包括例如应声明为类成员的运算符),实现不会隐式声明它们。程序员决定是否声明某些运算符。例如,您的类可能包含十几个赋值运算符。