2011-12-20 22 views
1

我有類Foo有一個構造函數給出:構造被稱爲在C少論據++

class Foo { 
public: 
    Foo(int w, char x, int y, int z); 
    ... 
}; 

int main() 
{ 
    Foo abc (10, 'a'); 
} 

我可以使用該構造這樣嗎?當構造函數簽名不匹配時?

那麼我該如何給出默認值?

+2

你有什麼嘗試?你的絆腳石是什麼?你發現哪種診斷很難理解? – 2011-12-20 13:54:11

回答

4

不,除非在簽名尾部的參數有默認值,例如:

class Foo { 
public: 
    Foo(int w, char x, int y=5, int z=0); 
    ... 
}; 

如果有違約,那麼你可以只提供非默認的參數,以及任選的一些違約的,即以下任何調用都是有效的:

Foo abc (10, 'a'); 
Foo abc (10, 'a', 3); 
Foo abc (10, 'a', 42, 11); 
2

你不能,除非缺少構造函數參數具有默認值。

例如,您可以此:

class Foo { 
public: 
    Foo(int w, char x, int y = 0, int z = 1); 
    ... 
}; 

int main() 
{ 
    Foo abc (10, 'a'); /* y is implicitly 0 and z is 1 */ 
} 
+1

或除非構造函數重載。 – DonCallisto 2011-12-20 13:54:22

0

否 - 如果沒有構造函數接受兩個參數相匹配的類型,你不能。

+0

那麼我如何給予默認值? – 2011-12-20 13:54:37

+0

將ctor的_declaration_改爲'Foo(int w,char x,int y = 10,int z = 10);'。不要更改_definition_(您自己編寫代碼的地方)。 – user1071136 2011-12-20 14:03:06

1

要提供默認參數,請將它們等於零或者使用某個默認值。

class Foo { 
public: 
    Foo(int w, char x, int y = 0, int z = 0) { } 
    // ... 
}; 

或者,

class Foo { 
public: 
    Foo(int w, char x, int = 0, int = 0); 
    // ... 
}; 

// Define your constructor here, note 'no default parameters' 
Foo::Foo(int w, char x, int y, int z) { } 
0

我建議重載構造函數,而不是提供默認值。

class Foo { 
public: 
    Foo(int w, char x); // y = 0, z = 1 
    Foo(int w, char x, int y); // z = 1 
    Foo(int w, char x, int y, int z); 
}; 

這到底風格問題:你需要複製的初始化列表利弊,因爲構造函數不能被鏈接,利弊可讀性恕我直言。請務必閱讀此thread