2010-02-14 90 views
3

編譯器如何知道如何正確處理此代碼?C++中的靜態變量構造

struct Foo 
{ 
    int bar; 

    Foo() 
    { 
     bar = 3; 
    } 

    Foo& operator=(const Foo& other) 
    { 
     bar = other.bar; 
     return *this; 
    } 

    int SetBar(int newBar) 
    { 
     return bar = newBar; 
    } 
}; 

static Foo baz; 
static Foo someOtherBaz = baz; 
static int placeholder = baz.SetBar(4); 

someOtherBaz.bar的終值是多少?

回答

10

someOtherBaz.bar的值將是一個翻譯單元內3.

靜態對象在它們出現的TU內的順序構造(注意,有靜態對象的在不同轉換單元沒有定義的順序)。

  1. 首先,baz將使用默認構造函數構造。這會將baz.bar設置爲3.
  2. Next someOtherBaz將通過複製構造函數構造。由於沒有定義拷貝構造函數,因此將使用默認的拷貝構造函數,它將複製每個字段。所以someOtherBaz.bar將給予3
  3. 最後,價值構建placeholderbaz.SetBar將被調用這也將改變baz(但不是someOtherBaz價值,因爲它們是獨立的對象;而你基於價值創造someOtherBazbaz,它們是不同的對象,所以可以獨立改變)。

所以,到了最後,你必須:

baz.bar: 4 
someOtherBaz.bar: 3 
placeholder: 4 
+0

@Samuel:我有一個疑問。在構建'someOtherBaz'後,使用編譯器提供的拷貝構造函數,賦值運算符函數將被調用'static Foo someOtherBaz = baz;'?否則,這裏的任務是什麼意思? – legends2k 2010-02-14 07:13:06

+1

@ legends2k - 對於單參數構造函數,'TYPE t = arg'與'TYPE t(arg)'相同。 – 2010-02-14 08:25:14

+1

@ legend22K - 代碼中沒有賦值 - 使用=符號不是賦值,它是複製構造函數的調用。 – 2010-02-14 09:46:07