临时变量调用拷贝构造函数的次数

来源:互联网 发布:sqlserver删除主键约束 编辑:程序博客网 时间:2024/05/22 23:46


          昨晚磊神的讲座讲了很多很纠结的问题。    

         今天就看了一下一直不懂的拷贝构造函数中,临时变量调用拷贝构造的次数问题。    

         下面用了昨晚的程序片段,当然我对一些地方进行了简化。。。  


     1 #include <iostream>                                                                                        2 #include <string>                                                                    3                                                                                      4 using namespace std;                                                                 5                                                                                      6 int i = 0;                                                                           7 struct A                                                                             8 {                                                                                    9     int i_;                                                                          11     A() { i_ = i++; cout << "Construct: " << i_ <<endl; }                           12     A( const A& ) { i_ = i++; cout << "Copy: " << i_  <<endl; }                     13     ~A(){ cerr << "~A: " << i_ << endl;}                                            14 };                                                                                  15                                                                                     16 A func()                                                                            17 {                                                                                   18     cout << "in func" << endl;                                                      19     A tmp;                                                                          20     cout << "return func" << endl;                                                  21     return tmp;                                                                     22 }                                                                                   23 int main()                                                                          24 {                                                                                   25     A a = func();                                                                   26                                                                                     27     cout << "-----------" << endl;                                                 28     return 0;                                                                       29 } 


运行结果:


【解释运行结果】

in func
Construct: 0 //【func里面的普通构造函数】
return func
Copy: 1//【xvalue,将一个xvalue的返回值调用一次拷贝构造函数作为临时变量,目的:给main函数里面的变量a赋值】
~A: 0//【func里面的普通构造函数对应的对象调用析构函数----已经作为返回值返回了,完成了它的使命】
Copy: 2//【调用A a的拷贝构造函数;A a = func(); 等价于 A a( func() )】
~A: 1//【析构xvalue,已经完成了使命了】
-----------
~A: 2//【析构A a】


昨晚还有关于左值引用和右值引用的知识,等我后面好好思考一下再挪到博客上来吧。

0 0
原创粉丝点击