2010-12-24 22 views
2

mainでの明示的なコンストラクタ呼び出しが次のコードを使用してどのように動作するかを理解しようとしています。コンストラクタDependency1()は代わりDependency1 :: Dependency1()の関数呼び出しとして使用され、コードが完全に正常に動作する場合mainで明示的にコンストラクタ呼び出しを関数呼び出しパラメータとして使用

#include<iostream> 

using namespace std; 

class Dependency1 
{ 
     bool init; 
public: 
    Dependency1() : init(true) { 
    std::cout << "Dependency1 construction" 
       << std::endl; 
    } 
    void print() const { 
    std::cout << "Dependency1 init: " 
       << init << std::endl; 
    } 



}; 


class Dependency2 { 
    Dependency1 d1; 
public: 
    Dependency2(const Dependency1& dep1): d1(dep1){ 
    std::cout << "Dependency2 construction "; 
    print(); 
    } 
    void print() const { d1.print(); } 
}; 

void test(const Dependency1& dd1) 
{ 
    cout << " inside Test \n"; 
    dd1.print(); 
} 



int main() 
{ 

    test(Dependency1()); 
    Dependency2 D1(Dependency1()); // this line does not work 

    return 0; 
} 

機能試験が呼び出されています。

私は同様の概念を使用してDependency2のオブジェクトD1を作成すると機能しません。 私は間違った理解に基づいてここで何か間違っているようです。

コンパイラは、スコープ解決が使用されていないと私はDependency2のコンストラクタにパラメータとしてそれを使用する場合、なぜそれが

おかげで、 に動作しない場合であっても、メインでDependency1()の呼び出しを解決する方法を知っておく必要がありAnand

答えて

1

Dependency1()は、Dependency1型の一時オブジェクトを作成し、それが関数testに渡されます。

+0

+1簡潔でわかりやすい。 –

+0

ありがとう、しかし、私はDependency2オブジェクトを作成するために同様のことを使用すると、なぜ動作しません。 – Anand

+0

@Anand:私の答えをチェックしてください。 –

7

test(Dependency1())

これは、関数testを呼び出し、クラスDependency1の一時オブジェクトを渡します。 testの定義における仮パラメータはconstへの参照であり、temporariesはconstの参照にバインドできるため、コードは機能します。

Dependency2 D1(Dependency1()); // this line does not work

これは、C++、最も厄介な解析と呼ばれています。 D1は、Dependency2を返す関数と解釈され、Dependency1を返す関数へのポインタを引数にとります。

を試してみてください。Dependency2 D1((Dependency1()));を試して、出力の変更を確認してください。

注:括弧を追加すると、コンパイラは(Dependency1())を式として扱います。

+0

鉱山よりも多くのポイント。 – Oswald

+0

それは素晴らしいです。ありがとう。コンパイラがオブジェクトではなく関数であると認識させる他の方法はありますか? – Anand

+0

@Prasoon:この完全な答えは+1です。良い仕事:-) – Nawaz

関連する問題