【问题标题】:Why does the address operator come as a default member of C++ class and what is it?为什么地址运算符是 C++ 类的默认成员,它是什么?
【发布时间】:2014-11-28 06:23:38
【问题描述】:

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

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

  2. 1234563 有什么特殊用途吗?

【问题讨论】:

  • 没有隐含的operator &() 成员,当您编写&obj 时使用了内置运算符,重载它通常是一个非常糟糕的主意。
  • 而且您似乎遗漏了 move-ctor 和 move-assignment,这两者在适当的情况下都会有默认配置。
  • @Satus 我的问题完全不同。
  • @All 请尽可能回答我的第二个问题。

标签: c++ address-operator


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 为什么说重载一元 & 是个坏主意?如果您需要智能指针或类似的东西,这是必要的。
  • @Jean-BaptisteYunès 他说通常。我会说永远不会,除非我最近遇到了一个有意义的案例。但有一个例外并不意味着这通常是一个坏主意。 (而且我看不出使用智能指针在哪里是个好主意。)
  • 是的,我误解了“通常”。获取某物的地址可以为您提供指向它的智能指针。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 2012-02-27
    • 2020-02-18
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多