15.多个对象的拷贝和析构

1.注意事项

1.如果类有成员对象,那么先调用成员对象的构造函数,再调用本身的构造函数,析构函数的调用顺序反之
2.成员对象的构造函数调用和定义顺序一样
3.注意,如果有成员对象,那么实例化对象时,必须保证成员对象的构造和析构能被调用

程序1:

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2023年2月17日21:21:45
#include <iostream>
using namespace std;

class BMW
{
public:
	BMW()
	{
		cout << "BMW构造" << endl;
	}
	~BMW()
	{
		cout << "BMW析构" << endl;
	}
};

class Buick
{
public:
	Buick()
	{
		cout << "Buick构造" << endl;
	}
	~Buick()
	{
		cout << "Buick析构" << endl;
	}
};

class Maker
{
public:
	Maker()
	{
		cout << "Maker构造" << endl;
	}
	~Maker()
	{
		cout << "Maker析构" << endl;
	}
private:
	BMW bmw;//成员对象
	Buick bui;//成员对象
};
//如果类有成员对象,那么先调用成员对象的构造函数,在调用本身的构造函数
//析构函数调用顺序反之
//2.成员对象的构造函数调用和定义顺序一样
//3.注意,如果有成员对象,那么实例化对象时,必须保证成员对象构造和析构
void test01()
{
	Maker m;
}

int main()
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:

BMW构造
Buick构造
Maker构造
Maker析构
Buick析构
BMW析构
请按任意键继续. . .

2.初始化列表


1.初始化列表是干什么用的,指定调用成员对象的某个构造函数

2.初始化列表只能写在构造函数

3.如果使用了初始化列表,那么所有的构造函数都要写初始化列表

4.如果有多个对象需要指定调用某个构造函数,用逗号隔开

5.可以使用对象的构造函数传递数值给

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2023年2月17日21:21:45
#include <iostream>
using namespace std;

class BMW
{
public:
	BMW(int a)
	{
		cout << "BMW有参构造" << a << endl;
	}
	~BMW()
	{
		cout << "BMW析构" << endl;
	}
};

class Buick
{
public:
	Buick()
	{
		cout << "Buick构造" << endl;
	}
	~Buick()
	{
		cout << "Buick析构" << endl;
	}
};

class Maker
{
public:
	Maker() :bmw(10)
	{
		cout << "Maker构造" << endl;
	}
	~Maker()
	{
		cout << "Maker析构" << endl;
	}
private:
	BMW bmw;//成员对象
	Buick bui;//成员对象
};
//如果类有成员对象,那么先调用成员对象的构造函数,在调用本身的构造函数
//析构函数调用顺序反之
//2.成员对象的构造函数调用和定义顺序一样
//3.注意,如果有成员对象,那么实例化对象时,必须保证成员对象构造和析构
void test01()
{
	Maker m;
}

class BMW2
{
public:
	BMW2(int a)
	{
		cout << "BMW2构造" << a << endl;
	}
	~BMW2()
	{
		cout << "BMW2析构" << endl;
	}
};

class Buick2
{
public:
	Buick2(int b, int c)
	{
		cout << "Buick2构造" << endl;
	}
	~Buick2()
	{
		cout << "Buick2析构" << endl;
	}
};

class Maker2
{
public:
	//初始化列表
	//注意1:初始化列表只能写在构造函数
	//Maker2() :bmw(10)
	//{
	//	cout << "Maker2构造" << endl;
	//}
	//如果有多个对象需要制定某个构造函数,用逗号隔开
	Maker2(int a, int b, int c) :bmw(a), bui(10, 20)
	{
		cout << "Maker2构造" << endl;
	}
	//注意2:如果使用了初始化列表,那么所有的构造那函数都要写初始化列表
	Maker2(const Maker& m2) :bmw(40),bui(10, 20)
	{

	}
	/*
	void printMaker2() :bmw(10)
	{

	}
	*/
	~Maker2()
	{
		cout << "Maker2析构" << endl;
	}
private:
	BMW2 bmw;//成员对象
	Buick2 bui;//成员对象
};

//初始化列表是调用成员对象的指定构造函数
void test02()
{
	Maker2 m(30, 10, 20);
}

int main()
{
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

输出结果:

BMW2构造30
Buick2构造
Maker2构造
Maker2析构
Buick2析构
BMW2析构
请按任意键继续. . .

参考资料

参考资料来源于黑马程序员等

posted @   CodeMagicianT  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示