- #include <iostream>
- using namespace std;
- class B
- {
- public:
- B()
- {
- cout<<"default constructor"<<endl;
- }
- B( B &b)
- {
- cout<<"copy constructor"<<endl;
- }
- ~B()
- {
- cout<<"destructed"<<endl;
- }
- B(int i):data(i)
- {
- cout<<"constructed by parameter " << data <<endl;
- }
- B& operator=(B& b)
- {
- cout<<"======== "<<endl;
- return *this;
- }
- private:
- int data;
- };
- B Play(B b)
- {
- return b;
- }
- int main()
- {
- B(5);
- // 無名對象,先通過B(int)構造,再析構
- B t1=Play(B(4));
- // 載入Play(5)的時候調用B的構造函數B(int),根據參數5構造一個B的實例b
- // 在return b返回的時候調用B的拷貝構造函數構造一個新的臨時對象返回
- // return語句離開b的作用域,此時調用b的析構函數
- B t2=Play(t1);
- // 載入Play(t1)時調用調用B的拷貝構造函數,構造對象b
- // return b時先調用B的拷貝構造函數構造一個新的臨時對象返回
- // 然後調用b的析構函數
- t2=t1;
- // 局部對象 t1,t2 離開作用域,調用其析構函數
- return 0;
- }
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
同一進程中的多個線程共享代碼段(代碼和常量)、數據段(靜態和全局變量)和擴展段(堆存儲),但是每個線程有自己的棧段。棧段又叫運行時棧,用來存放所有局部變量和臨時變量(參數、返回值、臨時構造的變量等)。