当前位置: 首页 > java >正文

初识C++类的6个默认成员函数

目录

一、初始化和清理

二、拷贝复制

三、取地址重载

四、重要说明

五、注意事项

六、示例代码


        在C++中,当一个类没有显式定义某些成员函数时,编译器会自动生成6个默认成员函数。这些函数可以分为以下几类:

一、初始化和清理

1、构造函数:在对象创建时完成初始化工作

  • 如果没有定义,编译器生成默认构造函数(无参、函数体为空)

  • 对于内置类型不做初始化,自定义类型会调用其默认构造函数

class Date {
public:// 构造函数Date() {// 初始化代码}
};

2、析构函数:在对象生命周期结束时完成清理工作

  • 如果没有显式定义,编译器生成默认析构函数(函数体为空)

  • 默认析构函数对内置类型不做处理,对于自定义类型成员,会调用其析构函数

    class Date {
    public:// 析构函数~Date() {// 清理代码}
    };


二、拷贝复制

1、拷贝构造函数:使用同类对象初始化创建新对象

  • 如果没有显式定义,编译器会生成默认的拷贝构造函数

  • 默认生成的拷贝构造函数进行浅拷贝(逐成员拷贝、按字节拷贝)

  • 对于指针成员需要自定义实现深拷贝

    class Date {
    public:// 拷贝构造函数Date(const Date& d) {// 拷贝逻辑}
    };

2、赋值运算符重载:把一个对象赋值给另一个已存在的对象

  • 如果没有显式定义,编译器会生成默认的赋值运算符,默认生成的进行浅拷贝

  • 需要处理自赋值问题和释放原有资源

    class Date {
    public:// 赋值运算符重载Date& operator=(const Date& d) {if (this != &d) {// 赋值逻辑}return *this;}
    };

三、取地址重载

1、普通对象取地址运算符重载:普通对象的取地址操作

  • 默认实现返回对象地址

  • 极少需要自定义实现

2、const对象取地址运算符重载:const对象的取地址操作

  • 默认实现返回对象地址

  • 极少需要自定义实现

class Date {
public:// 普通对象取地址Date* operator&() {return this;}// const对象取地址const Date* operator&() const {return this;}
};
  • 这两个运算符通常不需要显式实现

  • 编译器生成的默认版本就能满足大多数需求


四、重要说明

  1. 前4个成员函数(构造、析构、拷贝构造、赋值重载)最为重要,需要重点掌握

  2. 后2个取地址重载函数在实际开发中很少需要自定义实现

  3. C++11新增了移动构造函数和移动赋值运算符,属于高级特性

  4. 默认生成的函数行为:

    • 对于内置类型不做处理

    • 对于自定义类型成员会调用其相应成员函数


五、注意事项

  1. C++11之后新增了移动构造函数和移动赋值运算符

  2. 默认生成的函数行为可能不满足需求(特别是涉及资源管理时),需要显式实现

  3. 对于包含指针成员或需要资源管理的类,通常需要自定义拷贝构造函数和赋值运算符


六、示例代码

class Date {
private:int year;int month;int day;public:// 1. 构造函数Date(int y = 1970, int m = 1, int d = 1) : year(y), month(m), day(d) {}// 2. 析构函数~Date() {}// 3. 拷贝构造函数Date(const Date& other) : year(other.year), month(other.month), day(other.day) {}// 4. 赋值运算符重载Date& operator=(const Date& other) {if (this != &other) {year = other.year;month = other.month;day = other.day;}return *this;}// 5. 取地址运算符重载(通常不需要实现)Date* operator&() { return this; }const Date* operator&() const { return this; }
};
http://www.xdnf.cn/news/17273.html

相关文章:

  • 基于 Socket.IO 实现 WebRTC 音视频通话与实时聊天系统(Spring Boot 后端实现)
  • LongVie突破超长视频生成极限:1分钟电影级丝滑视频,双模态控制告别卡顿退化
  • PyTorch如何实现婴儿哭声检测和识别
  • 串联所有单词的子串-leetcode
  • 解读 gpt-oss-120b 和 gpt-oss-20b开源模型
  • 多账号管理方案:解析一款免Root的App分身工具
  • 抖音、快手、视频号等多平台视频解析下载 + 磁力嗅探下载、视频加工(提取音频 / 压缩等)
  • 编程之线性代数矩阵和概率论统计知识回顾
  • 基于langchain的两个实际应用:[MCP多服务器聊天系统]和[解析PDF文档的RAG问答]
  • 表单元素与美化技巧:打造用户友好的交互体验
  • 基于Ruby的IP池系统构建分布式爬虫架构
  • Qt帮助文档跳转问题修复指南
  • Flink-1.19.0源码详解9-ExecutionGraph生成-后篇
  • 通信中间件 Fast DDS(一) :编译、安装和测试
  • 汽车线束设计—导线的选取
  • WEB开发-第二十七天(PHP篇)
  • 中国MCP市场:腾讯、阿里、百度的本土化实践
  • Disruptor 消费者核心:BatchEventProcessor解析
  • 脱机部署k3s
  • 嵌入式硬件中MOSFET基本控制详解
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
  • FluentUI的介绍与使用案列
  • Pytest项目_day06(requests中Session的用法)
  • Spring文件泄露与修复方案总结
  • Go语言版JSON转TypeScript接口生成器:支持智能递归解析与命名优化
  • [Python 基础课程]Set
  • [Oracle] ROUND()函数
  • ORACLE 19C建库时卡在46%、36%
  • 《设计模式之禅》笔记摘录 - 13.迭代器模式
  • Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!