2012-03-28 80 views
4

我是C++編程新手,所以請不要太苛刻:)。下面的示例說明了我的問題的最基本描述。說我有這個函數的聲明在頭文件:C++函數,我可以給一個對象什麼默認值?

int f(int x=0, MyClass a); // gives compiler error 

編譯器會抱怨,因爲下面有默認值的參數參數應該有默認值了。

但是,我可以給第二個參數什麼默認值?

的想法是,該功能可以被稱爲與不足有兩個參數,如果不休息相關的特定情況下,讓所有的下列應該去:

MyClass myObj; // create myObj as an instance of the class MyClass 
int result=f(3,myObj); // explicit values for both args 

int result=f(3); // explicit for first, default for second arg

int result=f(); // defaults for both

+0

是否有可能將int f(int x = 0,MyClass a);'轉換爲int f(MyClass a,int x = 0);'? – andre 2012-03-28 14:21:08

+0

人們不會苛刻的SO :-),但C++會。 ;-)。出於好奇:你爲什麼選擇學習C++? – Andre 2012-03-28 14:27:35

回答

4

你可能想也考慮提供過載,而不是默認參數,但對於特定的問題,因爲MyClass類型有默認的構造函數,如果它在你的設計是有道理的,你可以默認爲:

int f(int x=0, MyClass a = MyClass()); // Second argument default 
             // is a default constructed object 

您可以通過手動添加重載獲得用戶的代碼有更大的靈活性,如果你想:

int f(MyClass a) {  // allow the user to provide only the second argument 
    f(0, a); 
} 

你也應該考慮使用接口引用(帶MyClass通過const引用)

0

你能做的最好的是

int f(MyClass a, int x=0); 

在這種情況下,您可以使用一個參數(MyClass)和默認的第二個參數或兩個顯式參數(MyClass,int)來調用函數。

0
int f(int x=0, MyClass a = MyClass()); 
1

我覺得你可以做以下任一操作:

int f(MyClass a, int x=0); // reverse the order of the parameters 
int f(int a=0, MyClass a = MyClass()) // default constructor 
0

你可以做一個

int f(int x=0, MyClass a = MyClass()); 

並根據需要添加構造函數的參數。

相關問題