C++高级——探秘对象构造和析构(一)

探秘对象构造和析构(一)

首先我们先看我们的类代码:

class Test
{
   
public:
	//带一个整型参数的构造函数
	Test(int a = 10) :ma(a) 
	{
    cout << "Test(int)" << endl; }
	//析构函数
	~Test() 
	{
    cout << "~Test()" << endl; }
	//拷贝构造函数
	Test(const Test &t) :ma(t.ma) 
	{
    cout << "Test(const Test&)" << endl; }
	//赋值函数
	Test& operator=(const Test &t)
	{
   
		cout << "operator=" << endl;
		ma = t.ma;
		return *this;
	}
private:
	int ma;
};

再来看我们的main函数:

int main()
{
   
	//调用test(int)构造
	Test t1;
	//调用拷贝构造
	Test t2(t1);
	//调用拷贝构造
	Test t3 = t1;
	/* 这里Test(20)是显式生成临时对象 但是C++编译器在生成新对象的时候会对临时对象进行优化,减少开销 这里其实就t4(20); */
	Test t4 = Test(20); 
	cout << "--------------" << endl;
	//相当于调用了t4的operator =函数,其中t2是参数
	t4 = t2;
	/* 1.这里先显式的调用构造函数,Test(int),30是参数 2.然后调用operator=,临时对象是参数 3.临时对象析构 */
	t4 = Test(30);
	// 这是隐式生成临时对象,相当于int -> Test(int),其他步骤和显式一样的
	t4 = (Test)30;

	//这个也是隐式生成,相当于int -> Test(int),其他步骤和显式一样的
	t4 = 30; 
	
	cout << "--------------" << endl;
	//先构造一个临时对象,然后析构,p此时是失效指针
	Test *p = &Test(40);
	//这里,临时对象和引用结合,相当于临时对象有了别名(ref),生存期被延长了
	const Test &ref = Test(50);
	cout << "--------------" << endl;
	return 0;
}

运行结果:

Test(int)
Test(const Test&)
Test(const Test&)
Test(int)
--------------
operator=
Test(int)
operator=
~Test()
Test(int)
operator=
~Test()
Test(int)
operator=
~Test()
--------------
Test(int)
~Test()
Test(int)
--------------
~Test()
~Test()
~Test()
~Test()
~Test()

构造顺序

先看类代码:

class Test
{
   
public:
	// Test() Test(10) Test(10, 10)
	Test(int a = 5, int b = 5)
		:ma(a), mb(b)
	{
   
		cout << "Test(int, int)" << endl;
	}
	~Test()
	{
   
		cout << "~Test()" << endl;
	}
	Test(const Test &src)
		:ma(src.ma), mb(src.mb)
	{
   
		cout << "Test(const Test&)" << endl;
	}
	void operator=(const Test &src)
	{
   
		ma = src.ma;
		mb = src.mb;
		cout << "operator=" << endl;
	}
private:
	int ma;
	int mb;
};

再看main函数代码:

Test t1(10, 10); // 第一个构造,调用Test(int, int)
int main()
{
   
	Test t2(20, 20); // 第三个构造,调用Test(int, int)
	Test t3 = t2; // 第四个构造,调用Test(const Test&)
	// 静态关键字只有被用到才会构造,相当于static Test t4(30, 30);
	static Test t4 = Test(30, 30); // 第五个构造,调用Test(int, int),临时对象被优化了
	t2 = Test(40, 40); // 第六个,Test(int, int) operator= ~Test()
	// 这个看第二个参数,也就是第二个50,相当于(50, 50) = (Test)50; Test(int)
	t2 = (Test)(50, 50); // 第七个,Test(int,int) operator= ~Test()
	t2 = 60; //Test(int) 第八个,Test(int,int) operator= ~Test()
	Test *p1 = new Test(70, 70); // 第九个, Test(int,int) 
	Test *p2 = new Test[2]; // 第十个,相当于两次 Test(int,int) Test(int,int)
	Test *p3 = &Test(80, 80); // 第十一个 Test(int,int) ~Test()
	const Test &p4 = Test(90, 90); // 第十二个 Test(int,int)
	delete p1; // 析构~Test()
	delete[]p2; // 析构两次~Test() ~Test()
}
Test t5(100, 100); // 第二个调用,调用Test(int, int)

构造顺序和析构顺序相反。
全局变量永远都比main函数先行构造,想知道原因可以去看我的程序员的自我修养博客专栏,C++相关问题。
运行结果:

Test(int, int)
Test(int, int)
Test(int, int)
Test(const Test&)
Test(int, int)
Test(int, int)
operator=
~Test()
Test(int, int)
operator=
~Test()
Test(int, int)
operator=
~Test()
Test(int, int)
Test(int, int)
Test(int, int)
Test(int, int)
~Test()
Test(int, int)
~Test()
~Test()
~Test()
~Test()
~Test()
~Test()
~Test()
~Test()
~Test()

参考文献

[1] 施磊.腾讯课堂——C++高级.图论科技,2020.7.

全部评论

相关推荐

11-29 11:21
门头沟学院 Java
点赞 评论 收藏
分享
AI牛可乐:哇,听起来你遇到了什么挑战呢!🐮牛可乐在这里,虽然小,但是勇敢又聪明,想听听你的具体情况哦!如果你愿意的话,可以点击我的头像给我私信,我们可以一起想办法应对挑战,好不好呀?🌟🎉
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440928次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41537次浏览 524人参与
# 阿里云管培生offer #
119930次浏览 2219人参与
# 地方国企笔面经互助 #
7933次浏览 18人参与
# 同bg的你秋招战况如何? #
75751次浏览 552人参与
# 虾皮求职进展汇总 #
114497次浏览 885人参与
# 北方华创开奖 #
107331次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454159次浏览 34849人参与
# 实习必须要去大厂吗? #
55696次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149839次浏览 1977人参与
# 投递实习岗位前的准备 #
1195754次浏览 18547人参与
# 你投递的公司有几家约面了? #
33181次浏览 188人参与
# 双非本科求职如何逆袭 #
661963次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157606次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11402次浏览 275人参与
# 发工资后,你做的第一件事是什么 #
12447次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35638次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20093次浏览 240人参与
# 我的上岸简历长这样 #
451937次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39248次浏览 314人参与
# 非技术岗是怎么找实习的 #
155855次浏览 2120人参与
牛客网
牛客企业服务