2011-11-18 143 views
0

我是新的c + +我有一個關於默認參數的問題。 如果有以下原型C++中的默認參數

void f(int=10,int=20,int=30,int=40) 

如果funcion是通過傳遞2個參數來叫,我們如何確保這些argumnts被視爲第一和第三,而中,第二和第四採取的函數作爲默認值。

+0

閱讀MSDN文章 - http://msdn.microsoft.com/en-us/library/91563f79(v=VS.100).aspx – adatapost

回答

6

你不能。函數的參數按順序與參數匹配。您可以使用,而不是重載的默認參數是這樣的:

void myFunc(int a,int b,int c,int d); 
void myFunc(int a,int c) { 
    myFunc(a,20,c,40); 
} 
+1

你將如何確保'myFunc(1,2)'調用第二個函數,而不是第一個函數?另外,如果你想調用第一個函數,傳遞前兩個參數呢? – Nawaz

+0

如果你沒有在'void myFunc(int a,int b,int c,int d)的原型中定義默認值''編譯器會選擇正確的函數。否則,它會給你編譯器錯誤。 – expert

+2

@Nawaz我沒有把任何參數的默認參數。如果你想要第一個,爲第二個提供四個參數或兩個參數。 – IronMensan

3

應該是不可能的。他們會被視爲前兩名。

您可以使用不同的名稱創建一個函數,帶兩個參數並調用f

另外,如果你想模擬命名參數,你可以使用類似於fluent interfaces的東西。例如:

#include <iostream> 
using namespace std; 

int f_impl(int a,int b, int c, int d){ 
    cout << a << " " << b << " " << c << " " << d << endl; 
    return 42; 
} 

struct f{ 
    int _a, _b, _c, _d; 
    f() : _a(10), _b(20), _c(30), _d(40){} 
    f& a(int a){ _a = a; return *this;} 
    f& b(int b){ _b = b; return *this;} 
    f& c(int c){ _c = c; return *this;} 
    f& d(int d){ _d = d; return *this;} 
    int operator()(){ return f_impl(_a, _b, _c, _d); } 
}; 

#define F(x) (f()x()) 

int main(){ 

    f().a(100).c(300)(); 

    cout << F(.b(1000).d(4000)) << endl; 

    return 0; 
} 

輸出:

100 20 300 40 
10 1000 30 4000 
42 
3

這不是如何C++工作的默認參數。如果您將兩個參數傳遞給函數f,它們將始終代表前兩個參數,而後兩個參數將爲3040

換句話說,C++函數僅支持位置參數。

+3

...或者你可以請求標準委員會添加關鍵字參數。 :) –

1

正如其他人說你不能這樣做,在C++。

但是,您可以使用四個整數成員創建結構/類,這些整數成員已初始化爲您定義的值。你會將它作爲參數傳遞給函數。

struct Param 
{ 
    int a; 
    int b; 
    int c; 
    int d; 

    Param() : a(10), b(20), c(30), d(40) {} 
    void setA(int value) { a = value; } 
    void setB(int value) { a = value; } 
    void setC(int value) { a = value; } 
    void setD(int value) { a = value; } 
} 

void f(Param& param) {} 

Param param; 
param.setA(67); 
param.setC(9); 
f(param); 
1

你問的是所謂'Named Parameters'的功能。

默認參數和命名參數的組合爲您提供了更多選項來完成像您所建議的操作,但不幸的是,C++沒有命名參數。但是,一些其他語言,如C#和VB以及可能是Python命名參數

0

實際上,您可以在C++中使用boost::parameter(在wiki文章中提到的命名參數中提供了一些幫助)命名參數。