2010-12-08 7 views
6

私は最終結果を確認していますが、なぜこの質問がそれなのか理解できません。C++クラスの質問

は、次のクラス宣言を仮定する:

class Testing { 
public: 
     Testing(int n); 
     void Show(const Testing& w, int a = 10); 
     int value; 
private: 
     int DoThis(); 
}; 

は、次のコード行は、main()のプログラムにしようとするものとし、そのxがタイプTestingであり、propertly作成されています。

x.Show(18);法的または違法

答えは合法である、私は2番目のパラメータがあるため= 10の必要されていないことを理解し、しかし18はタイプTestingではないためと、その無効なパラメータではないでしょうか?

答えて

16

テストには、整数をとる非explicitコンストラクタがあります。したがって、intは暗黙的にTestingに変換することができます。

表示にはconst Testing &Testing &だけでなく)が使用されるため、一時的にそれを渡すことができます。最後に、2番目のパラメータはオプションなので、値を指定する必要はありません。

この全体のメカニズムは、あなたが道で、これを行うことができますものです:ここでは

void f(const std::string &str); 
// ... 
f("Hello"); 

は、"Hello"const char *に減衰タイプconst char (&)[6]のですが、あなたはこのように、const char *からstd::stringを構築することができますstd::stringパラメータが必要な場合はconst char *の使用を許可します。

これは一時的な構成であるため、値またはconst参照によって渡されるパラメータに対してのみ有効です(参照には失敗します)。また、コンストラクタにexplicitとマークしてはいけません。ここで

+0

ありがとう、いくつかの良い答えがありましたが、これは非常に徹底的です。私に説明をする時間をとってくれてありがとう。 – dubyaa

+0

'' Hello ''の型は' const char(&)[6] 'です。これは' const char * 'に崩壊します。 –

3

コンストラクタ:

Testing(int n); 

intからTestingへの暗黙的な変換を提供し、これは次いでint 18から構成Testingインスタンスである第1パラメータ及び第二と、Showのプロトタイプにマッチします

explicit Testing(int n); 
:あなたはこのような暗黙の型変換を防止している場合、パラメータはデフォルト値10

ています

コードはコンパイルされません。

5

Testingにはintを受け入れるコンストラクタがあるため、そのc-torを使用して、最初のパラメータのオブジェクトTestingが自動的に構築されます。

x.Show(Testing(18)); 
6

C++での自動変換の概念はimplicit conversion sequencesと呼ばれる、があります:コードは、実際のようなものに取り組んで終わります。このようなシーケンスでの変換は、ユーザーが定義したものでも1つでもかまいません。また、一時オブジェクトのコンストラクターを呼び出すことは、ユーザー定義の変換です。const参照にバインドされ、Show()呼び出しが完了すると破棄されるので、ここでは一時的なものを作成しても問題ありません。