# include
# include
using namespace std;
class test
private:
int a;
string name;
};test& copybyref(int val, string na)
test copybyparameter(const test t)
test copybyval(int val, string na)
int main()
總結:
拷貝構造函式呼叫的4情況:
①顯式呼叫拷貝建構函式:
如test n = test(m);
test b(m);
隱式呼叫:
②定義乙個物件並初始化的時候呼叫
test x = m;
③函式返回型別為類的物件
如 test copybyval(int val, string na)
④函式形參型別為類的物件
如copybyparameter(const test t)
下列語句:
test p = test(10,"q");
本來應該是先生成乙個test類的臨時物件,然後呼叫拷貝建構函式把物件值賦給p
但是編譯器投機取巧,既然臨時物件只是為了去初始化p,除此之外再沒其他作用。
還不如先生成乙個"臨時物件",然後把這個"臨時物件"的記憶體送給即將要定義的物件test p算了。
所以其實不會呼叫拷貝建構函式,只是在物件p的記憶體空間中利用給定的實參生成乙個物件,生成的這個物件就成了p。
所以test p = test(10,"q"); 與 test p(10,"q"); 完全等價
同理test k = test(); 也不會呼叫拷貝建構函式
test k; 與 test k = test(); 完全等價
同樣地,
test m = copybyval(20,"n");
由於copybyval(20,"n")返回乙個test類的物件,所以copybyval(20,"n")函式會觸發拷貝建構函式生成乙個臨時物件
本來應該是copybyval(20,"n")返回的這個臨時物件會再次呼叫拷貝建構函式去初始化物件m ,
但是編譯器投機取巧,將這個臨時物件的記憶體空間送給了即將要定義的物件m
即在物件m的記憶體空間中生成"臨時物件",生成的這個"臨時物件"自然就成了物件m
test& m = copybyval(20,"n")也同理
而1、test p;
2、p = copybyval(20,"n");
由於語句1已經定義了物件p,為p分配了記憶體空間,
所以語句2中copybyval(20,"n")生成的臨時物件的記憶體空間沒法再送給物件p,
所以生成的這個臨時物件通過賦值運算子= 將物件值賦給p, 語句2結束後(遇到;時)臨時物件就會銷毀
C 建構函式之預設建構函式
參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...
C 建構函式之委託建構函式
委託建構函式 c 11新標準擴充套件了建構函式初始值的功能,使得我們可以定義所謂的委託建構函式。乙個委託建構函式使用它所屬類的其他建構函式執行它自己的初始化過程,或者說它把它自己的一些 或者全部 職責委託給了其他建構函式。和其他建構函式一樣,乙個委託建構函式也有乙個成員初始值的列表和乙個函式體。在委...
C 之建構函式
參考 c 程式設計指南 類是否用 static 來修飾,有兩種,一種是用static修飾,一種則不是。對於前者,如果,類提供了乙個無引數的建構函式,那麼new 例項化物件時候,就會呼叫這個無引數的建構函式 也叫預設建構函式 如果,類提供了乙個有引數的建構函式,但是new時候,依然沒有提供引數,那麼情...