呼叫情況分為兩種:
下面這個類中的預設成員函式只做了一件事就是呼叫時列印各自的函式名稱。
class aa
aa(const aa& a)
~aa()
void
operator=(const aa a)
};
第一種呼叫情況如圖,編譯器沒有進行任何優化。函式呼叫時先構造了a1,再把a1當引數傳給了函式f這裡是用a1拷貝構造了a ,在返回a時利用a拷貝構造了一塊臨時空間tmp。返回之後要銷毀棧幀了,所以這時就開始呼叫析構函式了,由於棧是先進後出的原則,所以這時先析構了拷貝構造出來的a。再進行賦值運算子的過載,函式f的返回值被利用完了,析構a拷貝構造出來的tmp,最後test1函式呼叫完畢該銷毀棧幀了,這時將a1析構。
這是第一種情況執行完成後所執行的結果
函式執行後的結果。
還有一種較為複雜的呼叫(復合函式形式的呼叫)
編譯器有優化的情景,這段**先構造了a1,再以a1為引數傳入函式f拷貝構造了a,函式返回a,在返回a時利用a拷貝構造了一塊臨時空間(臨時空間具有常性)tmp。函式f執行完該銷毀棧幀了,這時先析構了拷貝構造出來的a,再以tmp作為下一次呼叫函式f的引數拷貝構造a,這裡編譯器做了一次優化,編譯器將兩次拷貝構造優化為一次(即沒有建立對臨時物件的拷貝構造而是直接拷貝構造了下一次的形參a)。到了這裡就和上面的情況一模一樣了
此次**執行的結果是
這幾種情景下對四個預設成員函式的呼叫其實很好分析,難就難在編譯器會對某些情景進行悄無聲息的優化,所以分析是一定要考慮清楚編譯器是否進行了優化。編譯器進行優化的原則很簡單,就是**在同一行它才會進行優化。這裡編譯器對拷貝構造優化的機率最多,所以重點考慮編譯器是怎麼對拷貝構造進行優化的。
C 預設成員函式
概念 object oriented programming,縮寫 oop 是一種程式設計范型,同時也是一種程式開發的方法。物件指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。c 不是純物件導向語言,而是基於物件導向的語言 ps 因為它包含c的...
類的預設成員函式
class time time int hour,int minute,int second 有參的建構函式 time int hour 9,int minute 54,int second 23 全預設建構函式 time int hour,int minute 12,int second 30 半...
c 類的預設成員函式
類的組成包括資料成員與成員函式。在類中一共有有六個預設成員函式,建構函式 拷貝建構函式 析構函式 賦值操作符過載 取位址操作符過載 const修飾的取位址操作符過載 利用乙個例項 日期類 進行舉例 先是定義乙個日期類 class date 這就是乙個簡單的類定義。下面依次介紹各個預設成員函式 一.建...