类和对象III

六个默认函数:

  1. 初始化和清理:

1️⃣构造函数:主要完成初始化工作

2️⃣析构函数:主要完成清理工作

2.拷贝复制

3.取地址重载

一、构造函数:

其特征如下:

  1. 函数名与类名相同
  2. 无返回值(也不需要写void)
  3. 对象实例化时编译器自动调用
  4. 可以重载(因为函数有多种初始化方式)
  5. 如果类中没有显示写构造函数,那么编译器会自动生成一个无参的默认构造函数,用户显示定义就不会生成
  6. 1️⃣一般情况下有内置类型成员,就需要自己写构造函数,不能用编译器自己生成2️⃣全部都是自定义类型成员,可以考虑让编译器自己生成

结论:

1.一般情况下,构造函数都需要我们自己写

2. a.内置类型成员都有缺省值,且初始化符合我们的要求不需要写

例如:

复制代码
struct TreeNode
{
	TreeNode* _left;
	TreeNode* _right;
	int val;
};
class Tree
{
private:
	TreeNode* _root;
};

b.全是自定义类型的构造,且这些类型都定义默认构造

二、析构函数:

其特征如下:

  1. 无参数无返回值
  2. 一个类只能有一个析构函数,析构函数不能重载
  3. 对象生命周期结束时,编译器自动调用析构函数(1.内置类型成员不做处理2.自定义类型会去调用他的析构函数)

什么情况下需要我们自己写析构???

  1. 一般情况下,有动态申请内存(如栈),就需要显示写析构函数释放资源
  2. 没有动态申请的资料不需要写析构
  3. 需要释放资源的成员都是自定义类型,不需要写析构

三、拷贝函数:

  1. 拷贝构造函数是构造函数的一个重载形式

  2. 拷贝构造函数的成参数只有一个且必须是类类型对象的引 用,使用传值方式编译器会直接报错,因为会发生无穷递归

    复制代码
    Date d2(d1)
        → 调用 Date(Date& d)
        → d 是 d1 的别名,直接操作原对象,不拷贝
        → 正常完成 d2 的初始化

    最好加一个const这样写反了就可以检查出来:

    复制代码
    #include<iostream>
    using namespace std;
    
    class Date
    {
    	
    	
    public:
    	Date(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day; 
    	}
    	void Init(int year, int month, int day)
    	{
    		_year = year;//这里的_year是this->year,是d2的year
    		_month = month;
    		_day = day;
    	}
    	void Print()
    	{
    		cout << this << endl;
    		cout << _year << "-" << _month << "-" << _day << endl;
    	}
    	Date(const Date& d)
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    	
    	 }
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    
    
    int main()
    {
    	Date d1(2026,6,12);
    	Date d2(d1);
    	return 0;
    }

注意:

  1. 内置类型成员完成值拷贝/浅拷贝
  2. 自定义类型成员会调用他的拷贝构造

浅拷贝问题:1️⃣析构两次报错2️⃣一个修改会影响另一个

这种情况如果不自己写拷贝函数,函数调用结束调用析构函数的时候会释放两次同一片空间

解决方法:重新开辟一个空间(深拷贝)

相关推荐
程序喵大人36 分钟前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng1 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
wdfk_prog2 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕2 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫2 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通3 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦4 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
qq_2518364575 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
野生风长5 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
FoldWinCard5 小时前
D6 Python 基础语法 --- 保留关键字
开发语言·python