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
有讲错的地方欢迎指正~

浙公网安备 33010602011771号