为什么地址运算符是C++类的默认成员,它是什么

Why does the address operator come as a default member of C++ class and what is it?

本文关键字:默认 成员 它是什么 地址 运算符 C++ 为什么      更新时间:2023-10-16

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

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

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

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

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

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

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

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

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

在C++标准关于运算符过载分辨率的第 13.3.1.2 节中,可以找到以下规则:

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

如果默认情况下为所有类型都提供了成员operator&,则可行集永远不会为空。 由于存在当可行集为空时要执行的操作的规则,因此可以确保类型最初没有成员operator&