2011-03-10 88 views
1

這兩個構造函數有什麼區別?這兩個構造函數有什麼區別?

int x, y; //position 

BasePoint(int px, int py) : x(px), y(py) {} 

int x, y; //position 

BasePoint(int px, int py) 
{ 
    x = px; 
    y = py; 
} 

什麼x(px), y(py)叫什麼?我什麼時候使用這種類型的變量初始化?

謝謝。

回答

6

第一個是做使用initialization-list初始化,二一個是使用賦值運算符做分配

第一個推薦!

BasePoint(int px, int py) : x(px), y(py) {} 
          ^^^^^^^^^^^^^ this is called initialization-list! 

閱讀FAQ:

初始化列表:Should my constructors use "initialization lists" or "assignment"?

的常見問題的答案開頭。實際上, 構造函數應初始化爲 規則 初始化列表中的所有成員對象。一個例外是 進一步討論[012]

閱讀完整答案。

3

什麼是x(px),y(py)叫?

這些被稱爲初始化列表。你實際上在做的是將px的值複製到xpyy

用途:

class foo 
{ 
    private: 
    int numOne ; 

    public: 
    foo(int x):numOne(x){} 
}; 

class bar : public foo 
{ 
    private: 
    int numTwo; 

    public: 
    bar(int numTwo): foo(numTwo), // 1 
         numTwo(numTwo) // 2 
    {} 
}; 

bar obj(10); 

注意派生構造函數的參數可以傳遞給基類構造函數。

2.編譯器可以解決,在這種情況下,哪一個是參數,哪一個是成員變量。如果有,這需要在構造函數,然後做 -

bar::bar(int numTwo) : foo(numTwo) 
{ 
    this->numTwo = numTwo; // `this` needs to be used. And the operation is called assignment. There is difference between initialization and assignment. 
} 
0
BasePoint(int px, int py) : x(px), y(py) {} 

這裏u的使用初始化列表 構造當對象不會走身體內並啓動那些values.it節省通過不進入構造函數的主體

這是調用派生類構造函數時的另一個用法。

:如果你使用的語句像

new derivedclass(a,b,c) 

,你可以這樣寫

derivedclass(int x,int y,int z):baseclass(a,b),h(z){} 
相關問題