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析构
请按任意键继续. . .
参考资料
参考资料来源于黑马程序员等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)