1. 程式人生 > >建構函式、複製建構函式、賦值運算子的呼叫

建構函式、複製建構函式、賦值運算子的呼叫

  • 1:呼叫無參建構函式,故:Foo constructor。
  • 2:向函式f傳入剛才構造的物件vf1,函式結束值vf1要銷燬。故:Foo copy constructor,Foo destructor
  • 3:由於g函式的形參是引用,故不會呼叫建構函式
  • 4:由於定義物件,並對此物件用產生的物件進行復制(建立一個新的物件,並用另外一個物件進行初始化),故:Foo copy constructor
  • 5:若編譯器不做優化,執行結果:h函式先建立物件,即Foo constructor;返回此物件時,故會建立臨時物件,並對此物件進行復制,即Foo copy constructor;執行完以後,h函式結束作用域,foo物件銷燬,即Foo destructor;由於只是賦值,並沒有定義新的物件,呼叫賦值運算子,即Foo operator =;最後臨時變數的使命完成,進行銷戶;即Foo destructor。而編譯器做優化以後,返回值優化的目的就是為了省去臨時物件的建立和銷燬的巨大開銷,這種開銷對程式設計師不可見,但是會潛在對程式效能產生很大影響。
    執行結果:Foo constructor,Foo operator =,Foo destructor 。返回值優化具體詳細細節見https://blog.csdn.net/hycxag/article/details/82999739
  • 6:堆上new一個Foo物件,即:Foo constructor
  • 7:delete刪除對應new分配的物件,即:Foo destructor
  • 8:當我們宣告一個具有初始長度的類容器的時候,編譯器會自動呼叫該類的建構函式對容器進行初始化,所以一般會認為產生3個Foo constructor的輸出。實際上,這裡的過程是首先生成一個臨時物件,然後以該臨時物件為藍本進行copy,即呼叫3次複製建構函式將臨時物件複製到容器中的每個元素,這時臨時物件已經完成其使命,因而編譯器呼叫解構函式將其釋放,即:Foo constructor,Foo copy constructor,Foo copy constructor,Foo copy constructor,Foo destructor