第19课
第19课 - 对象的构造(下)
1. 特殊的构造函数
(1)无参构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。
(2)拷贝构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制。
1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() 10 { 11 return i; 12 } 13 int getJ() 14 { 15 return j; 16 } 17 18 Test(const Test& t) 19 { 20 i = t.i; 21 j = t.j; 22 } 23 24 /* 25 Test() 26 { 27 } 28 */ 29 }; 30 31 int main() 32 { 33 Test t1; 34 35 /* 36 Test t2 = t1; 37 38 printf("t1.i = %d, t1.j = %d ", t1.getI(), t1.getJ()); 39 printf("t2.i = %d, t2.j = %d ", t2.getI(), t2.getJ()); 40 */ 41 42 return 0; 43 }
2. 拷贝构造函数
2.1 拷贝构造函数的意义
(1)兼容 C 语言的初始化方式 int i = 1; int j = i;
(2)初始化行为能够符合预期的逻辑
(3)深拷贝和浅拷贝
① 浅拷贝:拷贝后对象的物理状态相同 【编译器提供的拷贝构造函数只提供浅拷贝】
② 深拷贝:拷贝后对象的逻辑状态相同
1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 int* p; 9 10 public: 11 int getI(){return i;} 12 13 int getJ(){return j;} 14 15 int* getP(){return p;} 16 17 /* 18 //拷贝构造函数 19 Test(const Test& t) 20 { 21 i = t.i; 22 j = t.j; 23 p = new int; 24 25 *p = *t.p; 26 } 27 */ 28 29 30 //带参构造函数 31 Test(int v) 32 { 33 i = 1; 34 j = 2; 35 p = new int; 36 37 *p = v; 38 } 39 40 ~Test(){delete p;} 41 42 }; 43 44 int main() 45 { 46 Test t1(3); //调用Test(int v); 47 Test t2(t1); //调用Test(const Test& t) 48 49 printf("t1.i = %d, t1.j = %d, *t1.p = %d ", t1.getI(), t1.getJ(), *t1.getP()); 50 printf("t2.i = %d, t2.j = %d, *t2.p = %d ", t2.getI(), t2.getJ(), *t2.getP()); 51 52 return 0; 53 }