amp; t)
{
printf("Test(const Test& t) : %dn", t.mi);
mi = t.mi;
}
Test()
{
printf("Test()n");
mi = 0;
}
void print()
{
printf("mi = %dn", mi);
}
~Test()
{
printf("~Test()n");
}
};
Test func()
{
return Test(20);
}
int main()
{
Test t = Test(10); // ==> Test t = 10;
Test tt = func(); // ==> Test tt = Test(20); ==> Test tt = 20;
t.print();
tt.print();
return 0;
}" title="" data-original-title="复制">
#include<stdio.h>classTest
{private:
int mi;
public:
Test(int i)
{
printf("Test(int i) : %dn", i);
mi = i;
}
Test(const Test& t)
{
printf("Test(const Test& t) : %dn", t.mi);
mi = t.mi;
}
Test()
{
printf("Test()n");
mi = 0;
}
voidprint(){
printf("mi = %dn", mi);
}
~Test()
{
printf("~Test()n");
}
};
Test func(){
return Test(20);
}
intmain(){
Test t = Test(10); // ==> Test t = 10;
Test tt = func(); // ==> Test tt = Test(20); ==> Test tt = 20;
t.print();
tt.print();
return0;
}
输出:【g++】
Test(int i) : 10Test(int i) : 20
mi = 10
mi = 20
~Test()
~Test()
分析:
1. Test t = Test(10); 为什么拷贝构造函数没有被调用呢?
在古老的编译器中,会发生如下过程:
a. 生成临时对象(调用构造函数)
b. 用临时对象初始化 t (调用拷贝构造函数)
2. Test tt = func(); 为什么拷贝构造函数没有被调用呢?
在古老的编译器中,会发生如下过程:
a. 生成临时对象(调用构造函数)
b. 返回临时对象,初始化 tt (调用拷贝构造函数)
使用临时对象初始化对象,将额外产生一次拷贝函数的调用,C++ 编译器为了避免性能损失,在不影响最终执行结果的前提下,尽力减少临时对象的产生。
Test t = Test(10); ==> Test t = 10;
Test tt = func(); ==> Test tt = Test(20); ==> Test tt = 20;