昨晚磊神的讲座讲了很多很纠结的问题。
今天就看了一下一直不懂的拷贝构造函数中,临时变量调用拷贝构造的次数问题。
下面用了昨晚的程序片段,当然我对一些地方进行了简化。。。
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】
昨晚还有关于左值引用和右值引用的知识,等我后面好好思考一下再挪到博客上来吧。