ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

构造函数和析构函数在函数调用过程中的调用情况

2022-05-19 22:34:32  阅读:172  来源: 互联网

标签:main 函数调用 Destructor --- Constructor Test 和析构 Copy 构造函数


一个有趣的类

我在这个类中定义了构造,拷贝构造,移动构造,拷贝运算符,移动运算符,析构,这几种特殊函数。这个类可以观察调用对象时的操作实现。

class Test {
public:
	Test(string x):str(x){
		cout << "Constructor " << str << endl;
	}
	Test(const Test& x) :str(x.str) {
		cout << "Copy Constructor " << x.str << endl;

	}
	Test(Test&& x) :str(x.str) {
		cout << "Move Constructor " << x.str << endl;
	}

	Test& operator=(const Test& x) {
		cout << "Copy-Assignment Operator " << str << endl;
		str = x.str;
		return *this;
	}
	Test& operator=(Test&& x) {
		cout << "Move-Assignment Operator " << str << endl;
		str = move(x.str);
		return *this;
	}
	~Test() {
		cout << "Destructor " << str << endl;
	}

    void address(){
		cout << "address " << this << endl;
    }
	string  str;
};

使用代码

使用该类查看函数参数和返回值的内部实现

Test f(Test c) {
	cout << "---func start---" << endl;
	Test a("a"), b("b");

	cout << "---func end---" << endl;

	return a;
}
int main() {
	cout << "---start---" << endl;
	Test c("c");
	cout << "---entry---" << endl;
	Test a=f(c);
	cout << "---break---" << endl;
	Test b = a;
	b = a;
	cout << "---end---" << endl;
	return 0;
}

输出

以下是该代码在不同编译器下的输出,建议配合着源代码和分割线观看并理解。

可以看出Microsoft C/C++ 编译器是较符合预期的,没有进行太多的优化。

test_Microsoft C/C++ :

---main start---
Constructor c               Test c("c");
---entry---
Copy Constructor c          Test tf(Test c) 拷贝构造参数c。
---func start---
Constructor a               Test a("a"), b("b");
Constructor b               构造两个对象a、b。
---func end---
Move Constructor a          Test a=tf(c) 将函数内对象a移动到main中对象a。
Destructor b                离开函数,析构局部变量,
Destructor a                这里可以看出会先返回值后,再将变量析构。
Destructor c
---break---
Copy Constructor a          Test b = a 虽然使用的是“=”但还是调用拷贝构造
Copy-Assignment Operator a  b = a 正常调用拷贝运算符
---main end---
Destructor a                离开main函数析构对象
Destructor a
Destructor c


g++ 优化了一部分内容,另外通过调用该类的 address 方法,你会发现 main 函数中的 a 对象和调用函数中的 a 对象的地址相同。

test_g++ :

---main start---
Constructor c
---entry---
Copy Constructor c
---func start---
Constructor a
Constructor b
---func end---                  其他部分都和上面相同,但这里少了个移动操作。
Destructor b
Destructor c                    这里少了给析构a的操作。
---break---                     实际上是将a的对象地址直接给了main中的a,甚至没调用移动构造
Copy Constructor a
Copy-Assignment Operator a
---main end---
Destructor a
Destructor a
Destructor c


标签:main,函数调用,Destructor,---,Constructor,Test,和析构,Copy,构造函数
来源: https://www.cnblogs.com/komet/p/16289805.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有