2017-07-27 7 views
0

私は質問をうまく説明できないので本当に混乱していますが、多くの人が私を理解すると確信しています。 display('$')パラメータに値を渡す方法(デフォルトのパラメータ)

#include <iostream> 

using namespace std; 

void display(int n = 1, char c = '*'); 

int main() 
{ 
    display(); 
    display(5); 
    display('$'); 
    return 0; 
} 

void display(int n, char c) 
{ 
    for (int i = 1; i <= n; i++) 
     cout << c; 
    cout << endl; 
} 

、私はそのパラメータcにこのcharを渡し、1.誰もがこれを適切に行う方法を教えてもらえますで、そのデフォルト値、とnを使いたいですか?

+1

なぜ、別の 'display(char c = '*')'関数を使ってそのケースを処理するのですか? – tadman

+0

@tadmanビヘイビアが実装定義であるかどうかはわかりませんが、それは 'char'を' int'に昇格できるので、どの関数を呼び出すかあいまいにします。 – George

+0

@SchwiftyMcSchwifulface 'char'は' char'よりも 'int'よりも良い一致です。 –

答えて

4

あなたはそうではありません。関数を呼び出すと、パラメータは左から右に順番に一致します。つまり、display('$');cの代わりに'$'nとなります。

あなたができることは、少なくともこのケースでは、あなたが望むことをするための機能をオーバーロードしていることです。

void display(int n, char c); 
void display(int n); 
void display(char c); 
void display(); 

であなたはvoidintchar過負荷が主な関数を呼び出すと、「空白」であなたの充填、その事実を隠すことができます。そのように見えます

void display(int n) 
{ 
    display(n, '*'); 
} 

void display(char c) 
{ 
    display(1, c); 
} 

void display() 
{ 
    display(1, '*'); 
} 

ここでは、デフォルト値を繰り返しています。デフォルト値を変更すると、複数の場所で変更する必要があるため、これは脆弱になります。

+1

代わりに 'display(1)'を呼び出すように 'display()'を実装するので、デフォルトの ''*'' charは1つの場所にのみ指定されます。または 'display( '*')'を呼び出すように、デフォルトの '1'は1つの場所にのみ指定されます。両方のデフォルトを一つの場所で指定したい場合は、グローバル定義を使用します: 'const int def_n = 1; const char def_c = '*'; void display(int n){ディスプレイ(n、def_c); } void display(char c){ディスプレイ(def_n、c); } void display(){ディスプレイ(def_n、def_c); } ' –

2

デフォルトのパラメータは、右から始めて省略することができます。このように、あなたの関数

void display(int n = 1, char c = '*'); 

だけ

display();  // same as display(1,'*'); 
display(5);  // same as display(5,'*'); 
display(5,'a'); 

として呼び出すことができ、これに対処する方法はいくつかあります。例えばもし、あなただけの各過負荷が異なる署名を持って世話をする必要があり、単に

void display(char c) { display(1,c); }  

元の関数を呼び出すオーバーロードを提供することで(tadmanによるコメントで指摘したように)この場合、最も簡単なすることはできません

void display(char c = '*') { display(1,c); }  

display()はあいまいであるためです。 より多くのパラメータがある場合は、構造体を宣言する意味を作ることができます

struct Params { 
    int n; 
    char c; 
    Params() : n(1),c('*') {} 
}; 

デフォルト値は、任意の順序で使用するか、しないかをことができるので、これは、より良いより多くのパラメータを持つスケール:

Params p; 
p.c = 'a'; 
display(p); 
0

を私も見別の方法は、機能の再定義です。代わりに

void display(int n = 1, char c = '*') {} 

私は

void display(char c = '*', int n = 1) {} 

でそれを置き換えることができます。しかし、それはすべての条件で動作しますので、関数のオーバーロードは、より良いです。

関連する問題