2012-03-04 7 views
-3

は、宣言のこの種は、コンストラクタにデフォルト値を割り当てるために使用することができる。デフォルトパラメータ私は間違っていないよ場合はC++

/* .h */ 
class FooClass(){ 

    private: 
    int* data; 
    int depth, rows, columns; 
    char* desc; 

    public: 
    ... 
} 

/* .cpp */ 
FooClass::FooClass() 
    : data(NULL), depth(0), rows(0), columns(0), desc(NULL) 
{ 
    //whatever constructor does... 
} 

内のパラメータにデフォルト値を割り当てるために入院されていません機能:代わりドンでなければなりません

/* .h */ 
class FooClass(){ 

    public: 
     void foofunc(int var1, int var2, int var3, int var4); 
} 

/* .cpp */ 
FooClass::foofunc(int var1, int var2) 
    : var3(0), var4(5) 
{ 
    //whatever function does... 
} 

OKではありませんこのようなE:

OK

/* .h */ 
class FooClass(){ 

    public: 
     void foofunc(int var1, int var2, int var3 = 0, int var4 = 5); 
} 

/* .cpp */ 
FooClass::foofunc(int var1, int var2, int var3, int var4) 
{ 
    //whatever function does... 
} 

なぜ?

+0

あなたが持っている理由閉会に投票した? – Matteo

+0

宣言と定義が一致しないため、2番目と3番目の例はどちらも有効ではありません。同じ数のパラメータを作成した場合、どちらの方法も有効です。 – ssube

+0

@peachykeenまず第3の例は大丈夫です。私はコピー/貼り付けミスをしましたが、回答者は私のことを理解しました。私の2番目の例では、2番目の例では(私はそれが正しい***ではないことを知っているので、***マークが付いているので)コンストラクタの初期化リストとの混乱のために、質問を間違えると、それを閉じるための投票が行われるべきではありません。 – Matteo

答えて

2

最初の例は、オブジェクトのメンバーとベースのための「デフォルト値」の1つではありません。つまり、コンストラクタでのみ意味があります。initialisation listただし、コンストラクターは、他の関数と同じ構文を使用して、デフォルトの引き数値を持つことができます。

だから、これは例えば、罰金です:

explicit FooClass(int* data = NULL, int depth = 0, int rows = 0, int columns = 0, char* desc = NULL) 
    : data(data), depth(depth), rows(rows), columns(columns), desc(desc) 
{ 
} 

あなたは機能のあらゆる種類のためだけの単純なデフォルト値を超える必要がある場合は、機能の過負荷を考慮し、例えば:

void my_function(int a, int b) 
{ 
    // do stuff with a and b 
} 

void my_function() 
{ 
    // version with no arguments, "default" behaviour 
} 
1

コンストラクタは、クラスメンバーまたは親クラスを初期化しています。この関数はそのパラメータのデフォルト値を設定しています。

+0

したがって、関数にデフォルト値を設定する他の方法はありませんか?変数3のデフォルト値が必要な関数を呼び出しますが、変数4の値を指定するとコンパイラはどのように理解できますか? – Matteo

+0

できません。パラメータリスト内の後続の変数をすべて省略した場合にのみ、変数を省略することができます(デフォルト値を使用します)。 –

+0

第3引数と第4引数が十分に異なる型の場合、第3引数がない関数のバージョンで関数のオーバーロードを検討できます。注意しないと、混乱しているAPIにつながる可能性があります。 3番目の引数が適切なデフォルトを持っているが、4番目の引数がそうでない場合、それらの位置を交換することを検討してください。 – pmdj

関連する問題