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

本文详细介绍了拷贝构造函数在C++中的三种触发场景:对象初始化、函数参数传递及返回对象时的情况。并探讨了系统如何在特定条件下进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

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));
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值