#include using namespace std;
class test
~test()
test(const test &obj)
void operator=(const test &obj)
private:
int ma;
};int main()
以上**的執行結果是:
當我們使用test t1 = test(50);拷貝構造了同型別的物件的時候臨時物件不產生,故只呼叫了一次t1的建構函式。
當我們使用t2 = test(50)的時候因為此時t2物件已經存在,這裡並沒有拷貝構造的操作,故需要臨時變數的產生來給t2做等號賦值運算。然後語句結束後臨時物件就被析構。
t2 = 50 同理。
然後程式的最後析構為t2的析構和t1的析構。
那麼我們可以得出結論:如果臨時物件"拷貝構造"同型別的物件那麼臨時物件不產生。
引例子:
我們在上面**的基礎上增加倆個函式
類內函式:
int getdata()
類外函式獲取test物件
test gettestobject1(test t)
此時我們呼叫gettestobject1函式來看有多少個構造和析構
主函式:
int main()
結果:
一共有八行
第一行:t1的建構函式。
第二行:使用t1給引數t進行拷貝構造。
第三行:函式中的tmp的預設的建構函式。
第四行:函式中的tmp給main棧區的t2的拷貝構造(因為tmp是區域性變數,函式呼叫後它的宣告週期就結束了,如果要在main函式中取得函式中的物件,只能在tmp被析構前把它的內容拷貝構造給t2,)這裡還因為臨時物件給相同型別的物件拷貝構造,並不真正的產生臨時變數,故這裡相當於tmp直接給t2拷貝構造。
第五行:由於函式的執行完畢需要執行t和tmp的析構,這一行是析構tmp區域性物件。
第六行:析構t
第七行:析構t2
第八行:析構t1
修改函式:
test gettestobject2(test &t)
執行結果:
可以看到經過這麼修改,8行變為6行,少了引數t的構造和析構,避免了不必要的開銷,優化了物件方法呼叫的過程。
**:
test gettestobject3(test &t)
這樣之後結果:
這樣之後從上次優化後的六行變為四行。又優化了tmp的構造和析構,又進一步減少了物件方法呼叫的開銷。
上訴中所有的測試用例**總結:
#include using namespace std;
class test
~test()
test(const test &obj)
void operator=(const test &obj)
int getdata()
private:
int ma;
};test gettestobject1(test t)
test gettestobject2(test &t)
test gettestobject3(test &t)
int main()
1,函式呼叫傳參,如果是物件傳遞引用。(少一次構造和一次析構的物件方法開銷)。
2,函式需要返回物件值時候,返回臨時物件(少一次區域性物件的構造和析構)。
C 物件構造順序
程式裡不可能只有乙個物件,我們的程式裡處處都是物件,那麼物件的構造順序是怎麼樣的呢。還是按照在記憶體四區上的分布來分開說,此處不在說 段。如果物件是在棧上分配的,那麼肯定是在函式中建立的,只要main函式開始執行,就有了程式執行流,所以分配在棧上的物件的構造順序是按照順序執行流和物件的定義語句來確定...
C 物件的構造順序
在c 中物件的構造順序有三種 1 區域性構造物件順序 2 堆物件構造順序 3 全域性物件構造順序 1 區域性構造物件順序構造物件例子 當程式執行流到達物件的定義語句時進行構造 include class test test const test obj int main if i 4 else re...
java類構造物件的構造順序
我們先來看乙個例項 class example class bigexample extends example class staticitem class privateitem public class test 結果是這樣的 this is staticitem this is privat...