拷贝构造函数起作用的三种情况


拷贝构造函数起作用的三种情况:

1.当用类的对象去初始化同类的另一个对象时。

Date d2(d1);
Date d2 = d1;  //初始化语句,并非赋值语句。

2.当函数的形参是类的对象,调用函数进行形参和实参结合时。

void Func(A a1)  //形参是类Date的对象a1
{  }

int main( )
{
   A a
   Func(a2); //调用Func时,实参a2是类Date的对象,将调用拷贝构造函数,初始化形参a1.
   return 0;
}
3.当函数的返回值是对象,函数执行完成返回调用者时。
A Func1()
{
     A a1(4);
     return a1;   //函数的返回值是对象
}

int main( )
{
     A a2;
     a2 = Func1();   //函数执行完成,返回调用者时,调用拷贝构造函数
     return 0;
}

在函数Func1( )内,执行语句“return a1;”时,将会调用拷贝构造函数将a1的值复制到一个匿名对象中,
这个匿名对象是编译系统在主程序中临时创建的。函数执行结束时对象a1消失,但临时对象会存在于语句
“a2 = Func( )”中。执行完这个语句后,临时对象的使命也就完成了,该临时对象便自动消失了。
系统在什么情况下会进行优化?
1.当拷贝构造存在连续的赋值情况的时候,
2.当多个临时对象连续赋值的时候 , 简单点来说就是,在一次拷贝构造结束后,并没有直接返回给要创建的对象而是又再次进行了拷贝构造。
或者是,创建了一个临时对象,来进行拷贝构造,然后又返回了一个临时对象,再用这个返回的临时对象继续拷贝构造。这时候,系统就会自动优化。

看下面的题目,更深层次的理解VS下如何优化 :
Test1中调用了   2  次AA的拷贝构造函数,    1  次AA的赋值运算符函数的重载。  
Test2中调用了  2  次AA的拷贝构造函数,    0  次AA的赋值运算符函数的重载。 
Test3中调用了  3  次AA的拷贝构造函数,   0  次AA的赋值运算符函数的重载。 
class AA
{};

AA f (AA a)
{
return a ;
}

void Test1 ()
{
AA a1 ;
a1 = f(a1);
}

void Test2 ()
{
AA a1 ;
AA a2 = f(a1);
}

void Test3 ()
{
AA a1 ;
AA a2 = f(f(a1));
}








猜你喜欢

转载自blog.csdn.net/ling_hun_pang_zi/article/details/80234098