-1

C++ 类中有 5 个默认成员。默认构造函数、析构函数、复制构造函数、赋值运算符和地址运算符。

  1. 什么是地址运算符?是className* operator &() {}吗?

  2. 如果是这样,为什么编译器会默认生成这个地址运算符(因为我们在 C 中已经有了一个地址运算符,我们可以在没有额外开销的情况下获得对象的地址)?有什么特别的目的吗?

4

2 回答 2

3

你是从错误的前提开始的。特殊的成员函数是 (§12 [special]/p1)

  • 默认构造函数 - 如果没有用户声明的构造函数,则隐式声明
  • 复制构造函数和复制赋值运算符 - 如果不是用户声明的,则隐式声明
  • 移动构造函数和移动赋值运算符 - 仅当用户未声明复制/移动 ctor/赋值运算符或析构函数时才隐式声明
  • 析构函数 - 如果不是用户声明的,则隐式声明

一元operator &不是特殊的成员函数,也不存在编译器生成的operator &()函数。如果你写

struct B {} b;
B *pb = &b;

那么使用的是内置&运算符。不涉及函数调用或开销。它的行为就像您获取int变量的地址一样。

有些程序员手动重载 unary operator &。这通常是一个非常糟糕的主意。

于 2014-11-28T06:45:45.903 回答
1

在 C++ 标准的第 13.3.1.2 节中有关运算符重载决议的部分中,可以找到以下规则:

如果运算符是operator ,、一元operator &operator ->,并且没有可行的函数,则假定该运算符是内置运算符并根据第 5 条进行解释。

如果默认情况下为所有类型提供了一个成员operator&,则可行集永远不会为空。由于当可行集为空时有一个规则,因此您可以确保类型最初没有 member operator&

于 2014-11-28T06:52:54.860 回答