8、关于复制构造函数和析构函数的又一个例子

#include <iostream>
using namespace std;
class CMyclass {
	public:
	CMyclass() {};//无参构造函数
	CMyclass( CMyclass & c){ //复制构造函数
	cout << "copy constructor" << endl;
	}
	~CMyclass() { cout << "destructor" << endl; }//析构函数
};

void fun(CMyclass obj_ )
{
	cout << "fun" << endl;
}
CMyclass c;
CMyclass Test( )
{
	cout << "test" << endl;
	return c;
}
int main(){
	CMyclass c1; 	//创建c1,并调用无参构造函数初始化c1
	fun( c1);		//创建形参obj_ ,调用复制构造函数,将实参c1的值复制到形参obj_ 中		
	Test();
	return 0;
}
/*
输出结果:
copy constructor				调用复制构造函数初始化:fun()形参obj_
fun								执行fun
destructor 						//形参obj_消亡
test							进入Test()
copy constructor				构造一个临时对象,调用复制构造函数,将全局变量c的内容复制到这个临时对象中(初始化)
destructor 						//Test();调用结束, 返回值临时对象消亡 
destructor 						// 局部变量消亡
destructor 						// 全局变量消亡
*/

关于使用构造函数考虑的点:
(1)见到创建对象的句子:
考虑:先创建对象,
创建对象时使用参数:带参数的构造函数初始化该对象。
创建对象时没有使用参数初始化:使用不带参数的构造函数初始化该对象。
(2)见到函数返回一个对象的句子:
考虑:调用该函数时,返回语句一定会创建一个临时对象,这个临时对象使用复制构造函数进行初始化,将返回的值复制给这个临时对象。
(3)函数的形参为类对象的句子:
调用该函数时,一定会创建一个形参对象,该形参对象使用复制构造函数或者使用转换构造函数进行初始化。
(3)见到为对象赋值的句子:
等号两边类型相同:将右边赋值给左边。
等号两边类型不同:等号右边是否有课匹配的转换构造函数,如果有,将其转换为一个临时的对象,然后赋值给左边。

posted @ 2019-11-24 23:14  江南又一春  阅读(161)  评论(0编辑  收藏  举报