class TEST
{
public:
void print()
{
cout << "this is a test" << endl;
}
TEST(int a= 0, int b = 0, int c= 0):data(a),constint(b),ref(c)
{}
TEST(const TEST & t): data(t.data), constint(t.constint),ref(t.ref)
{
cout << "this is a copy" <<endl;
}
private:
int data;
float constint;
int ref;
};
int main(int agrc, char *argcv[])
{
TEST t = TEST(1,4,5);
TEST test = t;
}
我發現在VS里:
TEST t = TEST(1,4,5);//被優化為TEST t(1,4,5);這里我不明白:我的復制建構式除了復制外還做了其他事情啊:輸出。為什么也給優化了,這是為什么?
而
TEST test = t;沒有被優化;//這里我明白,編譯器只能呼叫復制建構式
uj5u.com熱心網友回復:
這個只是建構式多載而已,跟優化沒毛關系。uj5u.com熱心網友回復:
TEST t = TEST(1,4,5); 這句話沒有觸發拷貝建構式,而是使用了你自己定義的建構式。
TEST(int a= 0, int b = 0, int c= 0):data(a),constint(b),ref(c)
{}
uj5u.com熱心網友回復:
標準允許的,復制構造TEST t = TEST(1,4,5);這個其實相當于
TEST t(TEST(1,4,5));
因為用來初始化t的是個臨時物件,初始化完成后就丟棄,按標準允許直接按
TEST t(1,4,5);的方式構造到t,而且是“即使這樣可能導致改變行為的副作用”,也就是說即使你有自己的拷貝實作,拷貝建構式仍允許被忽略。
為了適應這個規定,你只能盡可能寫出不依賴于這種優化的程式邏輯。
另外這里有個VS不標準的地方,就是如果TEST(const TEST &)被宣告成了私有或者洗掉函式,VS會完全忽略掉檢查可訪問性,而標準規定做不做這種優化都要檢查訪問性。
uj5u.com熱心網友回復:
TEST t = TEST(TEST(1,4,5));uj5u.com熱心網友回復:
C++編譯器是很聰明的, 一些沒有用到的,都會優化掉轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122214.html
標籤:基礎類
