2016-06-16 5 views
-1

コードは、どのように正確に動作するかを理解するために作成したテストです。この行動は予期しないものです。 「作成済み」と「削除済み」が何回表示されるか知っていれば、私はしませんでした。 質問はそれがなぜ同じように行われているのでしょうか、違いはありませんか?コンストラクタとデストラクタの間の "予期しない"ペアリング。なぜそれはそれのように動作する必要がありますか?

struct A{ 
    int a=0x10; 
    A(){std::cout<<"A created"<<std::endl;} 
    ~A(){std::cout<<"A deleted"<<std::endl;} 
}; 

void test0(A a1,A a2){ 
    std::cout<<"test0"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl; 
} 

void test1(const A a1,const A a2){ 
    std::cout<<"test1"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl; 
} 

int main(int argc, char **argv) 
{ 
    A a,b; 
    test0(a,b); 
    test1(a,b); 
} 
+4

あなたが何を求めているのか分かりません。期待された行動は何でしたか?そして実際の行動は何でしたか? – chris

+0

私は、コンストラクタがデストラクタと同じくらい何回も実行されていると思いました。 –

+2

期待どおりの動作と観察された動作を追加する必要があります。 –

答えて

4

あなたはコンストラクタ呼び出しを誤ってカウントしています。既定のコンストラクターに加えて、コピーコンストラクターへの呼び出しがあります(Aオブジェクトを定義した関数に渡すとき)。コピーコンストラクタの定義を追加すると(デフォルト+コピー)コンストラクタとデストラクタの呼び出しの同数を示しています

#include <iostream> 

struct A{ 

    int a=0x10; 
    A(){std::cout<<"A created"<<std::endl;} 
    A(const A&) { std::cout << "A copied" << std::endl; } // Copy constructor! 
    ~A(){std::cout<<"A deleted"<<std::endl;} 
}; 

void test0(A a1,A a2){ 
    std::cout<<"test0"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl; 
} 

void test1(const A a1,const A a2){ 
    std::cout<<"test1"<<" a1="<<a1.a<<" a2="<<a2.a<<std::endl; 
} 

int main() 
{ 
    A a,b; 
    test0(a,b); 
    test1(a,b); 
} 

出力:

A created 
A created 
A copied 
A copied 
test0 a1=16 a2=16 
A deleted 
A deleted 
A copied 
A copied 
test1 a1=16 a2=16 
A deleted 
A deleted 
A deleted 
A deleted 

Live example

コンパイラは、デフォルトの実装を提供しますコピーコンストラクタ(あなた自身を定義していない場合)は、メンバフィールドのビット単位の簡単なコピーを行います。そのデフォルト実装は、関数本体にAオブジェクトを渡して、関数本体内にローカルコピーを構築するときに使用されていました。あなたが見ていた追加のデストラクタコールは、これらのコピーから来ました。独自のコピーコンストラクターを定義した場合、呼び出されたときにメッセージが出力され、合計が一致するようになりました。

関連する問題