2012-09-15 43 views
0

我有以下的C/C++代碼:結構的複製問題,編譯與我與Visual Studio 2008編譯VS2008

struct TEST_STRUCT{ 
    int nV; 
    float v; 

    TEST_STRUCT() 
    { 
     nV = 0; 
     v = 0.0; 
    } 
}; 

TEST_STRUCT v1; 
v1.nV = 100; 
v1.v = 2.0; 

const TEST_STRUCT v2;    //Making it 'const' to prevent any further changes 
(TEST_STRUCT)v2 = v1; 

int a = v2.nV;      //'a' is 0, why??? 

爲什麼會出現這樣一個奇怪的結果呢?

+0

你告訴編譯器對象是不變的,它依賴於它。 –

回答

3

你只是做了一件非常討厭的事情:你放棄了你的const限定詞。

const TEST_STRUCT v2 = v1; 

const TEST_STRUCT v2(v1); 

會給你你想要的東西......除非你確定違反const限定符這是非常,非常糟糕。

1

正如所指出的,您試圖分配給的對象是一個臨時對象,而原始對象保持不變。這是編譯器沒有抱怨的原因之一。如果你想投的實際對象你會使用一些這樣的事:

const_cast<TEST_STRUCT&>(v2) = v1; 

這仍然不會nessecarily工作,因爲當應用到開始了終身爲對象這個轉換結果不確定的行爲一個const對象:該對象可能位於只讀內存中,或者編譯器可能會用相應的初始值替換對其成員的訪問。

設置const對象的成員的唯一方法是在構建過程中。你方便地有兩個構造函數:你聲明的默認構造函數和編譯器爲你創建的一個拷貝構造函數,除非它被聲明或者一個子對象(非靜態成員或基類)沒有拷貝構造函數。因此,你會這樣寫:

TEST_STRUCT const v2(v1); 

TEST_STRUCT const v2 = v1; 

在這種情況下,兩個呼叫語義等價儘管後者通話理論上涉及兩個副本。如果v1具有不同的類型,則兩次調用與稍後調用先轉換然後複製略有不同。雖然副本通常會消失,但仍需要複製構造函數。

相關問題