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语言中的分支语句用法解读

    这篇文章主要介绍了C语言中的分支语句用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 关于C++中的友元函数的一些总结

    关于C++中的友元函数的一些总结

    以下是对C++中的友元函数进行了详细的总结介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++ std:map的使用方法

    C++ std:map的使用方法

    std::map是C++标准库中一个强大而高效的关联容器,本文就来介绍一下C++ std:map的使用方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Matlab实现极坐标堆叠柱状图的绘制

    Matlab实现极坐标堆叠柱状图的绘制

    极坐标堆叠图也是风玫瑰图的常用形式,MATLAB的bar绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图。本文将为大家提供Matlab绘制极坐标堆叠柱状图的示例代码,需要的可以参考一下
    2022-08-08
  • C++数组和指针的区别与联系

    C++数组和指针的区别与联系

    这篇文章主要介绍了C++数组和指针的区别与联系,数组是具有固定大小和连续内存空间的相同数据集合,指针是指存放内存地址的变量,更多详细资料请参考下面文章内容
    2022-01-01
  • C语言深入讲解动态内存分配函数的使用

    C语言深入讲解动态内存分配函数的使用

    这篇文章主要介绍了C语言动态内存分配,C语言内存管理相关的函数主要有realloc、calloc、malloc、free、柔性数组等,下面这篇文章带大家了解一下
    2022-05-05
  • C++ 中lambda表达式的编译器实现原理

    C++ 中lambda表达式的编译器实现原理

    C++ 11加入了一个非常重要的特性——Lambda表达式。这篇文章主要介绍了C++ 中lambda表达式的编译器实现原理,需要的朋友可以参考下
    2017-02-02
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解

    这篇文章主要介绍了C语言数据结构 链表与归并排序实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器

    这篇文章主要为大家详细介绍了C语言数据结构之简易计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • C/C++仿华容道小游戏

    C/C++仿华容道小游戏

    这篇文章主要介绍了C/C++仿华容道小游戏的相关资料,模仿实现华容道游戏,感兴趣的朋友可以参考一下
    2016-02-02

最新评论