C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ 取地址符

C++ 取地址符相关的默认函数

作者:越甲八千

本文主要介绍了C++ 取地址符相关的默认函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

C++编译器会为类自动生成两个默认的取地址运算符重载函数(取普通对象地址、取const对象地址),但它们不属于“六大默认成员函数”,而是编译器隐式生成的辅助函数,且几乎不会被开发者手动修改(除非有特殊需求)。

一、取地址运算符重载的默认函数

1. 函数原型(以class Cgoods为例)

函数类型原型作用
普通取地址运算符Cgoods* operator&()返回非const对象的地址(this指针)
const取地址运算符const Cgoods* operator&() const返回const对象的地址(const this)

2. 编译器默认实现

编译器生成的默认版本逻辑极其简单:直接返回对象的this指针,等价于:

// 普通版本
Cgoods* Cgoods::operator&() {
    return this; // 返回当前对象的地址
}

// const版本
const Cgoods* Cgoods::operator&() const {
    return this; // 返回当前对象的const地址
}

二、使用示例(验证默认行为)

在你之前的Cgoods类代码中,无需手动定义这两个函数,直接使用取地址符&即可:

int main() {
    Cgoods goods1("苹果", 9.9f);
    const Cgoods goods2("香蕉", 5.9f);

    // 调用普通取地址运算符:operator&()
    Cgoods* p1 = &goods1;
    cout << "普通对象地址:" << p1 << endl;

    // 调用const取地址运算符:operator&() const
    const Cgoods* p2 = &goods2;
    cout << "const对象地址:" << p2 << endl;

    return 0;
}

输出结果(地址为示例,实际不同):

带参构造函数调用:苹果
带参构造函数调用:香蕉
普通对象地址:0x7ffeefbff5e0
const对象地址:0x7ffeefbff600
析构函数调用:释放 香蕉 的内存
析构函数调用:释放 苹果 的内存

三、关键特性说明

1. 生成条件

2. 何时需要手动重载?

几乎不需要!只有极特殊场景下才会修改,比如:

示例:手动重载取地址运算符(禁止获取地址)

class Cgoods {
    // ... 其他成员不变 ...

    // 手动重载普通取地址运算符
    Cgoods* operator&() {
        return nullptr; // 不返回真实地址
    }

    // 手动重载const取地址运算符
    const Cgoods* operator&() const {
        return nullptr;
    }
};

int main() {
    Cgoods goods("苹果", 9.9f);
    cout << &goods << endl; // 输出 0(nullptr)
    return 0;
}

3. 和六大默认函数的区别

维度六大默认成员函数(构造/析构/拷贝/移动)取地址运算符重载函数
核心作用管理对象生命周期/资源提供对象地址的访问方式
生成优先级显式定义后编译器不再生成除非手动定义,否则始终生成
开发修改频率高频(如深拷贝、移动语义)几乎为0(特殊场景才修改)
异常风险高(如内存泄漏、重复释放)极低(仅返回指针)

总结

  1. 存在性:C++有取地址符相关的默认函数(两个版本:普通/const),但不属于核心六大默认成员函数;
  2. 默认行为:编译器生成的版本直接返回this指针,满足绝大多数场景需求;
  3. 使用建议:无需手动重载,只有禁止获取对象地址、修改地址返回逻辑等特殊场景才需要自定义;
  4. 核心记忆:取地址运算符重载是“辅助性默认函数”,优先级远低于构造/析构/拷贝/移动,日常开发几乎不用关注。

到此这篇关于C++ 取地址符相关的默认函数的文章就介绍到这了,更多相关C++ 取地址符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文