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