为什么地址运算符是C++类的默认成员,它是什么
Why does the address operator come as a default member of C++ class and what is it?
C++类中有 5 个默认成员。默认构造函数、析构函数、复制构造函数、赋值运算符和地址运算符。
-
什么是地址运算符?是
className* operator &() {}
吗? -
如果是这样,为什么编译器默认生成这个地址运算符(因为我们在 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&
。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- C++向量默认为成员参数
- 结构中的默认成员值或默认构造函数参数
- 构造函数可以更改默认成员类型吗?
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 如果有默认成员初始化,为什么要使用成员初始化列表
- “在成员函数之外封闭类的定义中需要默认成员初始值设定项” - 我的代码格式不正确
- 使用默认成员初始值设定项对 std::array 的元素进行零初始化
- C - 混合默认成员初始化器和成员初始化列表 - 坏主意
- 为什么默认成员值禁止使用支持列表初始化
- 自定义分配器和默认成员
- C++C-tor处理默认成员值构造异常
- 非静态数据成员上的成员初始值设定项列表和默认成员初始值设定项之间有什么区别?
- 为什么地址运算符是C++类的默认成员,它是什么
- C++:如何使某些类访问其对象中的默认成员?
- 如果std::make_unique从未被调用,为什么它在默认成员初始化中不需要参数
- 使用构造函数作为默认成员值
- 如何防止c++创建默认成员