2016-03-23 9 views
0
class A { 
public: 
    A(void) { cout << "A::A" << endl; } 
    A(const A& a) { cout << "A::A(a)" << endl; } 
    virtual ~A(void) { cout << "A::~A" << endl; } 
    virtual void g(void) { cout << "A::g" << endl; } 
}; 

class B : public A { 
public: 
    B(void) { cout << "B::B" << endl; } 
    ~B(void) { cout << "B::~B" << endl; } 
    void g(void){ cout << "B::g" << endl; } 
}; 

void print(A c) { 
    cout << "print" << endl; 
} 

int main(void) { 
    A a; 
    B b; 
    A* c = &b; 
    c->g(); 
    print(*c); 
    return 0; 
} 

私は理解していないと私はプログラムの開発のどの部分が、メソッドの印刷が所属んにはかなりわからないんだけど?なぜ、いつオーバーロードコンストラクタが実行されますか?この文<code>A::A(a)</code>取得者が実行する理由<code>c->g()</code>または</p> <p><code>print(*c);</code>を呼び出すときに

+0

'print'はメソッドではなく、自由な関数です。それは 'main'と同じ" part "に属します。このプログラムで 'c-> g()'を呼び出すと "A :: A(a)"は表示されません。 '' A :: A(a) ''は文ではありません。 – molbdnilo

+0

あなたの' print'は値によって引数を取るので、コピーを作る必要があります。 –

+0

値を 'print'関数に渡しています。その結果、コピーコンストラクタ 'A :: A(const&A)'が呼び出されます。 – Vishal

答えて

1

プリントisn't a method, it's a functionこのように、どこにも所属していません。これは単にプログラムの一部です。 関数はオブジェクト指向の前の年齢からのものですが、それでも重要な場所があります。次のように

void print(A c)機能を分けることができます。

  1. void、これは、この場合には、戻り値ではありません - 何も。
  2. print(これは関数の名前です。
  3. A c)、これは 単一parameterの種類 A、という名前 Cを取ることを意味します。そのようなA::A(const A &)として

オブジェクトAの​​あります。基本的にこの方法は、にタイプAのオブジェクトは型の新しいオブジェクトにコピーされるたびに呼び出されます

あなたがprint(*c)を呼び出すと、あなたは、これはが指すオブジェクトへの参照にポインタc結果derefrenceによってc(すなわち、タイプのオブジェクトA)。これはコピーprintにコピーされ、その結果、関数によって使用される一時的なconst A &になります。

これは、Copy-constructorが呼び出された理由です。

3

引数を値によってprint関数に渡すので、コピーコンストラクタを使用してコピーを作成する必要があります。そのため、コピーコンストラクタはprintが呼び出されたときに呼び出されます。

参照を呼び出すように変更する(またはポインタを渡す)と、コピーは行われません。


そして他の人が述べたように、printも「自由」機能、または非メンバ関数として知られる「正常な」機能、です。これはプログラムに属し、グローバルスコープに存在し、external linkageを持っています。

+0

ありがとうJoachim :) – LenC

関連する問題

 関連する問題