好久沒寫部落格了,部落格荒廢了,人也廢了,c++ primer果然經典,看了之後明白了許多之前不懂得細節。
當定義乙個新型別的時候,需要顯示或隱式地指定複製,賦值和撤銷該型別的物件時會發生什麼---這是通過定義特殊成員:複製建構函式、賦值操作符過載和析構函式來達到的。如果沒有顯示定義這些,編譯器會為我們實現。
之前學習c++語言時大家知道函式引數傳遞方式有兩種,值傳遞和引用傳遞。值傳遞開始自己理解為就是拷貝,但是執行的是什麼拷貝?=號函式還是拷貝建構函式,答案是拷貝建構函式。函式返回值時編譯器會創造乙個臨時變數,執行的也是拷貝建構函式。
view code
#include class結果截圖:point
point(
int _x=0,int _y=0
):x(_x),y(_y){}
point(
const point &pt)
point& operator=(const point &pt)
void
print()
};point
global
;point foo_bar(point arg)
int main(void
)
可以看到函式形參傳遞,返回值執行的都是拷貝建構函式。=號操作符函式什麼時候執行呢,答案是=號左邊物件早已存在時執行,否則依舊執行拷貝建構函式。
另外c++ 中的explicit 關鍵字可以限制編譯器的隱式轉換,據說是為了相容c的語法,函式傳參時,形參型別和實參不一致,會對實參執行乙個形參型別的建構函式,這個建構函式以這個形參為引數。
上列中的test=std::cin 就是這樣轉換的:
1.編譯器建立無名物件=point(std::cin)
2.test=無名物件
就是這麼乙個結果。
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...
C 拷貝構造小練習
標頭檔案 ifndef student h define student h 類 class weapon 角色類class gamer endif cpp檔案 define crt secure no warnings include include include include student...
C 拷貝建構函式
1 什麼時候會用到拷貝建構函式?當任何你想影印東西的時候,而不管東西被影印成什麼樣子。即任何你想利用乙個已有的類例項給另乙個類例項賦值時,這種賦值可能是顯式的,也可能是隱式的 顯式 classa 1 class 2 隱式 函式的形參有用到類物件卻沒有用引用或傳址技術時 函式的返回值是乙個物件也沒有應...