這兩個構造函數有什麼區別?這兩個構造函數有什麼區別?
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)
叫什麼?我什麼時候使用這種類型的變量初始化?
謝謝。
這兩個構造函數有什麼區別?這兩個構造函數有什麼區別?
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)
叫什麼?我什麼時候使用這種類型的變量初始化?
謝謝。
第一個是做使用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]
閱讀完整答案。
什麼是x(px),y(py)叫?
這些被稱爲初始化列表。你實際上在做的是將px
的值複製到x
和py
到y
。
用途:
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.
}
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){}