目錄
首先應該明確匿名物件,匿名物件是之沒有物件名,呼叫完建構函式後即析構的物件。下面通過**捕捉類的建構函式和析構函式,以進行說明:
#include
using namespace std;
class solution;
solution(const solution& s):m_num1(s.m_num1), m_num2(s.m_num2)
~solution()
private:
int m_num1;
int m_num2;
};int main()
**執行結果為:
通過**執行結果可以看到,建立匿名物件的時候,呼叫了類的建構函式,隨後立即呼叫了析構函式。我們可以直接利用匿名物件進行初始化類的成員的初始化,**如下:
#include
using namespace std;
class solution;
solution(const solution& s):m_num1(s.m_num1), m_num2(s.m_num2)
~solution()
int m_num1;
int m_num2;
};int main()
; //等價於solution(8,9)
cout << "s1.m_nu程式設計客棧m1 = " << s1.m_num1 << endl;
cout << "s1.m_num2 = " << s1.m_num2 << endl;
system("pause");
return 0;
}執行結果如下:
**呼叫了一次建構函式,可見匿名物件可以初始化類成員,就是將匿名物件轉化成了s1物件,這裡需要與拷貝建構函式區分開:
#include
using namespace std;
class solution;
solution(const solution& s):m_num1(s.m_num1), m_num2(s.m_num2)
~solution()
int m_num1;
int m_num2;
};int main()
**執行結果為:
對比以上兩個**可以發現,通過匿名物件初始化類成員並不是拷貝構造,只是一種替換,通過匿名物件初始化類成員並不會呼叫拷貝建構函式。
今年秋招筆試題最愛考查建構函式的呼叫時機,通常會結合繼承和多型來考察,這裡先說明一下拷貝建構函式的呼叫時機,後面再詳細說明帶繼承和多型的構造函式呼叫時機。
一、使用乙個已經建立的物件來初始化乙個新物件,如上面的**,建立物件s1的時候呼叫了有參建構函式,通過s1來初始化s2的時候呼叫了拷貝構造。
二、函式的引數是需要值傳遞的物件的時候
三、函式返回物件的時候
下面通過**驗證,當函式的引數是乙個需要值傳遞的物件的情況:
#include
using namespace std;
class solution;
solution(const solution& s):m_num1(s.m_num1), m_num2(s.m_num2)
~solution()
public:
int m_num1;
int m_num2;
};void showclassnum(sol程式設計客棧ution s)
int main()
**執行結果為:
通過**執行結果可以看到,s1物件呼叫了有參建構函式,當把s1傳給函式的引數s的時候呼叫了拷貝建構函式,函式執行完呼叫了s物件的析構函式。
當函式的返回值是乙個物件的時候,也會呼叫拷貝建構函式:
#include
using namespace std;
class solution;
solution(const solution& s):m_num1(s.m_num1), m_num2(s.m_num2)
~solution()
void changenum(int a, int b)
void shownum()
public:
int m_num1;
int m_num2;
};solution clearclassnum(solution s)
int main()
**執行結果為:
從**執行結果可以看出來,函式傳參的時候呼叫了拷貝構造,然後函式返回乙個物件的時候的也呼叫了拷貝構造。
需要注意的是,函式要返回物件的時候,不要使用引用的方式返回,因為函式的內的變數存放在堆疊區,在函式執行完畢後就會釋放這塊記憶體,引用就會出現問題。
面試的時候比較喜歡問的問題,首先淺拷貝就是我們常用的拷貝,實現了物件成員的拷貝,深拷貝就是在堆區申請空間,然後再進行拷貝操作,淺拷貝可以由編譯器完成,但是深拷貝需要我們自己完成,就是有在堆區開闢的記憶體,就一定要自己提供拷貝建構函式,防止淺拷貝帶來的重複記憶體釋放問題。**驗證如下:
#include
using namespace std;
class solution;
//如果不利用深拷貝在堆區建立新記憶體cdpky,會導致淺拷貝帶來的重複釋放堆區問題,導致程式出錯
solution(const solution& s):m_num1(s.m_num1), pm_num2(new int(*s.pm_num2))
~solution()
}void changenum(int a, int b)
void shownum()
public:
int m_num1;
int* pm_num2;
};void func()
int main()
**執行結果為:
c 一些注意事項
1.long int的位元組資訊 int在32位系統下是4位元組,long在32位也是4位元組,在64位int不變,但是long變成8位元組,所以我們的編譯器不同可能會導致我們處理int,long不同 2.注意c 有時候的強制型別轉換 注意最大最小值是不一樣的,int max 231 1 或 int...
C 的一些注意事項
1 類的構造 假定myclass是乙個自定義類,則當執行 myclass a 3 p 2 實際上執行建構函式的次數只有3次,也就是物件指標陣列不會引起執行建構函式。2 常資料成員 對於常資料成員,可以在宣告時一併初始化 c 11 也可以在建構函式內初始化。但是,不能不初始化。在宣告時初始化之後則無法...
一些注意事項
0.解題思路 a.普通思路 b.遞迴 bfs dfs c.動態規劃 比遞迴快 d.雙指標 比for迴圈快 如 快慢指標方法 e.用棧 1.陣列初始化 int a new int 5 a 0 預設為0.二維陣列也一樣。boolean b new boolean 5 b 0 預設為false.strin...