1. 程式人生 > >兩個特別的建構函式

兩個特別的建構函式

 

-無參建構函式

 沒有引數的建構函式:

 當類中沒有定義建構函式時,編譯器預設提供一個無參建構函式,並且其函式體為空;

-拷貝建構函式

 引數為const class_name & 的建構函式 (當前類物件的引用):

  當類中沒有定義拷貝建構函式,編譯器預設提供一個拷貝建構函式,簡單的進行成員變數的複製。

例項一:

 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 /*Test(const Test& t) 18 { 19 i = t.i; 20 j = t.j; 21 } 22 Test() 23 { 24 }*/ 25 }; 26 27 int main() 28 { 29 Test t1; 30 Test t2 = t1; 31
32 printf("t1.i = %d, t1.j = %d\n", t1.getI(), t1.getJ()); 33 printf("t2.i = %d, t2.j = %d\n", t2.getI(), t2.getJ()); 34 35 return 0; 36 }

 

拷貝建構函式意義:

1.相容C語言的初始化方式;

2.初始化行為能夠符合預期的邏輯;

淺拷貝:

拷貝後物件的物理狀態相同;

深拷貝:

拷貝後物件的邏輯狀態相同。

編譯器提供的拷貝函式只進行淺拷貝。(簡單的複製工作)
 
 1
#include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 int* p; 9 public: 10 int getI() 11 { 12 return i; 13 } 14 int getJ() 15 { 16 return j; 17 } 18 int* getP() 19 { 20 return p; 21 } 22 Test(const Test& t) 23 { 24 i = t.i; 25 j = t.j; 26 p = new int; 27 28 *p = *t.p; 29 } 30 Test(int v) 31 { 32 i = 1; 33 j = 2; 34 p = new int; 35 36 *p = v; 37 } 38 void free() 39 { 40 delete p; 41 } 42 }; 43 44 int main() 45 { 46 Test t1(3); 47 Test t2(t1); 48 49 printf("t1.i = %d, t1.j = %d, *t1.p = %d\n", t1.getI(), t1.getJ(), *t1.getP()); 50 printf("t2.i = %d, t2.j = %d, *t2.p = %d\n", t2.getI(), t2.getJ(), *t2.getP()); 51 52 t1.free(); 53 t2.free(); 54 55 return 0; 56 }