C++構造和析構

  1. #include <iostream>
  2. using namespace std;
  3. class B 
  4. {  
  5. public
  6.     B() 
  7.     {
  8.         cout<<"default constructor"<<endl; 
  9.     } 
  10.     B( B &b)
  11.     {
  12.         cout<<"copy constructor"<<endl; 
  13.     }
  14.     ~B() 
  15.     {
  16.         cout<<"destructed"<<endl;
  17.     } 
  18.     B(int i):data(i)
  19.     { 
  20.         cout<<"constructed by parameter " << data <<endl; 
  21.     }
  22.     B& operator=(B& b)
  23.     {
  24.         cout<<"======== "<<endl; 
  25.         return *this;
  26.     }
  27. private
  28.     int data; 
  29. };
  30. B Play(B b)
  31. {
  32.     return b;
  33. }
  34. int main()
  35. {
  36.     B(5);
  37.     // 無名對象,先通過B(int)構造,再析構
  38.     
  39.     B t1=Play(B(4));
  40.     // 載入Play(5)的時候調用B的構造函數B(int),根據參數5構造一個B的實例b
  41.     // 在return b返回的時候調用B的拷貝構造函數構造一個新的臨時對象返回
  42.     // return語句離開b的作用域,此時調用b的析構函數
  43.     B t2=Play(t1);
  44.     // 載入Play(t1)時調用調用B的拷貝構造函數,構造對象b
  45.     // return b時先調用B的拷貝構造函數構造一個新的臨時對象返回
  46.     // 然後調用b的析構函數
  47.     t2=t1;
  48.     // 局部對象 t1,t2 離開作用域,調用其析構函數
  49.     return 0;
  50. }

output:

constructed by parameter 5
destructed
constructed by parameter 4
copy constructor
destructed
copy constructor
copy constructor
destructed
========
destructed
destructed

 

  • 一個命名的自動對象,當程序的執行每次遇到它的申明時建立,每次程序離開它出現的塊(作用域)時銷燬;
  • 一個自由存儲對象,通過new運算符建立,通過一個delete運算符銷燬;
  • 一個非靜態成員對象,作爲另一個類對象的成員,在它作爲成員的那個對象建立或銷燬時,它也隨之被建立或銷燬;
  • 一個數組對象,在它作爲元素的那個數組被建立或銷燬的時候建立或者銷燬;
  • 一個局部靜態對象,在程序執行中第一次遇到它的申明時建立一次,在程序終止時銷燬一次;
  • 一個全局對象,名字空間的對象,類的靜態對象,它們只在“程序開始時”建立一次,在程序終止時銷燬一次;
  • 一個臨時對象,作爲表達式求值的一部分被建立,在它所出現的那個完整的表達式的最後被銷燬;
  • 一個在分配操作中由所提供的參數控制,在通過用戶提供的函數獲得的存儲裏放置的對象;
  • 一個union對象,它不能有構造函數和析構函數。
    (以上片段摘自<C++程序設計語言>,P218)


關於   如何計算sizeof(類)  
  空類:1  
  沒有虛函數:sizeof(數據成員)的和  
  有虛函數:    sizeof(數據成員)的和+sizeof(V表指針)=4  

 

同一進程中的多個線程共享代碼段(代碼和常量)、數據段(靜態和全局變量)和擴展段(堆存儲),但是每個線程有自己的棧段。棧段又叫運行時棧,用來存放所有局部變量和臨時變量(參數、返回值、臨時構造的變量等)。

 

 

發佈了134 篇原創文章 · 獲贊 29 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章