首页 > 其他分享 >006:奇怪的类复制(Mooc)

006:奇怪的类复制(Mooc)

时间:2022-08-18 22:12:15浏览次数:52  
标签:初始化 Mooc 调用 20 Sample 复制 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 }

赋值 和 初始化 的区别

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

 

讲解一下:

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

 

有讲错的地方欢迎指正~

标签:初始化,Mooc,调用,20,Sample,复制,006,赋值,构造函数
From: https://www.cnblogs.com/balabalabubalabala/p/16600303.html

相关文章