c++构造函数之拷贝构造

先上代码,定义类X
int number=1;

struct X{
	X():name("name"+to_string(number++)){cout<<name<<" X()"<<endl;}//默认构造
	X(int val):value(val),name("name"+to_string(number++)){cout<<name<<" X(int val)"<<endl;}//可隐式转换构造
	X(const X &):name("name"+to_string(number++)){cout<<name<<" X(const X &)"<<endl;}//拷贝构造
	~X(){cout<<name<<" ~X()"<<endl;}//析构
	int value;
	string name;//对象名
};
测试函数f1()
void f1()
{
	X x1;
	X x2=1;
	X x3=X();
	X x4=X(4);
	cout<<"x1.name="<<x1.name<<endl;//输出各个对象名字,方便观察调试结果
	cout<<"x2.name="<<x2.name<<endl;
	cout<<"x3.name="<<x3.name<<endl;
	cout<<"x4.name="<<x4.name<<endl;
	system("pause");
}

调用f1,一下是测试结果

c++构造函数之拷贝构造_第1张图片

x1的构造函数是默认构造毫无疑问,但按理来说,生成x2应该有两个有两个过程(因为x2是进行拷贝构造):第一,先调用X(int)这个构造函数生成一个临时变量,第二,再调用X(const X &)这个拷贝构造函数。但从打印结果来看,只有第一个过程,这是因为编译器优化的结果,编译器会把X x2=1,这条语句改写为X x2(1)。同理,对x3,x4也是一样的。

下面再看测试函数f2和f3

void f2(X){}
void f3(X x=1){}
//测试
<strong> f2(1);
 f3();</strong>

下面是运行结果

结果与测试f1的结果无异。



你可能感兴趣的:(C++,对象,构造函数,编译器,拷贝构造)