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

 更新时间:2026年03月20日 09:58:18   作者:越甲八千  
本文主要介绍了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. 生成条件

  • 编译器总是会生成这两个默认函数,除非你显式手动定义了对应的版本(普通/const);
  • 即使你定义了其他默认函数(如拷贝构造、移动赋值),这两个取地址函数仍会被生成。

2. 何时需要手动重载?

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

  • 禁止外部获取对象地址(返回nullptr);
  • 对地址做特殊处理(如返回对象内部某个成员的地址)。

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

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++ 取地址符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言结构体数组的定义和使用详解

    C语言结构体数组的定义和使用详解

    结构体中也有数组,称为结构体数组。它与数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项。本文将带大家详解了解结构体数组的定义与使用
    2021-12-12
  • C++对象模型和this指针详解

    C++对象模型和this指针详解

    这篇文章主要介绍了详解C++对象模型和this指针,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • C++两个cpp文件间如何进行各自函数的调用方式

    C++两个cpp文件间如何进行各自函数的调用方式

    这篇文章主要介绍了C++两个cpp文件间如何进行各自函数的调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++实现对象化的矩阵相乘小程序

    C++实现对象化的矩阵相乘小程序

    这篇文章主要为大家详细介绍了C++实现对象化的矩阵相乘小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C语言字符串替换:字符,字符串,字符数组详解

    C语言字符串替换:字符,字符串,字符数组详解

    这篇文章主要介绍了C++字符串替换的字符,字符串,字符数组,需要考虑的情况比较全面,有不错的借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++实现LeetCode(129.求根到叶节点数字之和)

    C++实现LeetCode(129.求根到叶节点数字之和)

    这篇文章主要介绍了C++实现LeetCode(129.求根到叶节点数字之和),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言中dlopen和dlsym的使用方式详解

    C语言中dlopen和dlsym的使用方式详解

    这篇文章主要为大家详细介绍了C语言中dlopen和dlsym的使用方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++超集C++/CLI模块的基本类型

    C++超集C++/CLI模块的基本类型

    这篇文章介绍了C++超集C++/CLI模块的基本类型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C++实现职工工资管理系统

    C++实现职工工资管理系统

    这篇文章主要为大家详细介绍了C++实现简单的职工工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    下面小编就为大家带来一篇Windows下使用Dev-C++开发基于pthread.h的多线程程序实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论