006:奇怪的类复制(有关构造函数)

 1 #include <iostream>
 2 using namespace std;
 3 class Sample {
 4 public:
 5     int v;
 6     Sample(int n = 0):v(n){};  //设置缺省值为0,没有初值时初始化v = 0
 7     Sample(const Sample& a){
 8         v = a.v + 2;//this -> v = a.v + 2; 
 9     }
10 };
11 void PrintAndDouble(Sample o)
12 {
13     cout << o.v;
14     cout << endl;
15 }
16 int main()
17 {
18     Sample a(5); //初始化
19     Sample b = a; //初始化
20     PrintAndDouble(b);
21     Sample c = 20; //  +初始化
22     PrintAndDouble(c);
23     Sample d;
24     d = a; //赋值操作
25     cout << d.v;
26     return 0;
27 }

1.赋值 和 初始化 的区别

“赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。 ”

 

2.复制构造函数起作用的三种情况:1.当用一个对象去初始化同类的另一个对象时

                                2. 如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用

                                3.如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用

 

3.类型转换构造函数

    1.定义转换构造函数的目的是实现类型的自动转换

 2.只有一个参数,而且不是复制构造函数的构造函数,一般就可以看作是转换构造函数

 3.当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)

 

4.讲解一下:

Sample a(5):调用构造函数Sample(int n = 0)  ==> a.v = 5

Sample b = a:因为是初始化操作,所以会先调用a的复制构造函数Sample(const Sample& a) ==> this.v = 5 + 2 = 7,然后用复制的a(此a非彼a,这是原来的a复制的临时对象,它并没有改变原来的a的值)来初始化b,此时调用b的构造函数Sample(const Sample& a) ==>  b = 7 + 2 = 9

Sample c = 20:初始化操作,这里情况有点特殊,用来初始化的值是个数值20,这个20会被自动转化为一个临时Sample对象【类型转换构造函数】,这个对象初值 n = 20,所以先调用类型转换构造函数Sample(int n = 0) ==> this.v = 20,然后用其来初始化c,此时调用c的构造函数Sample(const Sample& a) ==> c.v = 20 + 2 = 22

Sample d:创建了一个Sample对象d,因为没有设置初值,所以d.v为缺省值,即d.v = 0

d = a:赋值操作,调用重载运算符“=”,使d.v = a.v = 5

 

有讲错的地方欢迎指正~

posted @ 2022-08-18 22:02  balabalahhh  阅读(63)  评论(0)    收藏  举报