2013-06-18 7 views
7

は、これまでのところ、私はあなたがオブジェクトである関数の引数のデフォルト値を渡したい場合、あなたはこのようにそれを行うことを知っている値:デフォルトのオブジェクトの値が

void function(MyObject obj = MyObject()){ 
    ... 
} 

しかし、最近、私はいくつかの興味深い構文に近づき、混乱しています。 このような関数を呼び出すとどうなりますか?

void function(MyObject obj = 0){ 
    ... 
} 

注:ポインタではなくオブジェクトを渡しています。上記のコードはうまくコンパイルされますが、エラーや警告はありません。そして、これは、常に1つの引数でコンストラクタを呼び出す - MyObjectには、このように定義されています

また
class MyObject{ 
public: 
    MyObject(double n){std::cout << "Argumented\n";} 
    MyObject(){std::cout << "Default\n";} 
}; 

、(私が検索し、それを見つけることができなかったため)この動作はを文書化されて

+1

C++標準の第4章(標準変換)と第12.3章(特殊なメンバ関数/変換)。また、13.3.3.1(暗黙的な共起シーケンス)。 – jrok

+0

@jrokありがとうございました。 –

+0

ようこそ。章番号はn3337の草案ですが、公式(C++ 11)の標準では同じであると思います。 – jrok

答えて

11

0から暗黙的に構成されたパラメータは、コンストラクタを呼び出して、デフォルトでMyObjectに設定されます。このコンストラクタを使用すると、暗黙的にこのようなMyObjectsをインスタンス化することができます。この動作が意図されていない

MyObject o1 = 0; 
MyObject o2 = 420/10.; 

場合は、コンストラクタexplicitを作ります。示すように、二重からのいわゆるimplicit converting constructorを持って

explicit MyObject(double n); 

void function(MyObject obj = MyObject(0)); 
+1

また、この動作を無効にしたい場合は、コンストラクタを '明示的に 'マークすることができます – WaelJ

+0

ああ...なぜ前にそのことを考えなかったのですか?ありがとう。 –

5

MyObjectに:これはまたfunctionのデフォルトパラメータの変更が必要になります。 0は2倍で大丈夫ですので、MyObject(0.0)のように見えます。

MyObject obj = 0; 

コンパイルおよびタイプMyObjectの値を持っている、そしてMyObjectを取る関数呼び出しは、同じように動作することができるようになります:次の式と仮定すると

4

この関数シグネチャ想像:MyObject obj = 0;の値ので

function(MyObject obj = 0); 

void function(MyObject obj){ 
    ... 
} 

そして次の発信者コード:

MyObject obj = 0; 
function(obj); 

これは、この第二の発信者コードと等価であると構築されているMyObjectに等しいその行のコードで使用されます。

同じルールを利用して、のデフォルトのパラメータ値を入力するだけです。

関連する問題