兩個特別的建構函式
阿新 • • 發佈:2018-12-12
-無參建構函式
沒有引數的建構函式:
當類中沒有定義建構函式時,編譯器預設提供一個無參建構函式,並且其函式體為空;
-拷貝建構函式
引數為const class_name & 的建構函式 (當前類物件的引用):
當類中沒有定義拷貝建構函式,編譯器預設提供一個拷貝建構函式,簡單的進行成員變數的複製。
例項一:
1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9int 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; 3132 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 }