11
#include<iostream>
using namespace std;

class A{
public:
    static int cnt;
    A()
    { 
        ++cnt; 
        cout<<"constructor:"<<cnt<<endl;
    }
    ~A()
    {
        --cnt;
        cout<<"destructor:"<<cnt<<endl;
    }
};

int A::cnt = 0;

A f(A x){
    return x;
}
int main(){
    A a0;
    A a1 = f(a0);
    return 0;
}

プログラムは次を出力します。

コンストラクタ:1
デストラクタ:0
デストラクタ:-1
デストラクタ:-2

コンストラクタとデストラクタはペアで表示されませんか?

4

3 に答える 3

14

カウンターを増やすコピー コンストラクターを追加する必要があります。

A(const A&)
{ 
    ++cnt; 
    cout<<"copy constructor:"<<cnt<<endl;
}

明示的に追加しない場合、コンパイラは counter で何もしないものを生成しcntます。

この表現

A a1 = f(a0);

a0、コピー コンストラクターを利用する のコピーを作成しています。コピーの正確な数はコピー省略によって異なる場合がありますが、プログラムの最後にあるcnt必要があります。0

注: C++11 では、コンパイラによって生成されたムーブ コピー コンストラクターの可能性も考慮する必要がありますが、独自のコピー コンストラクターを宣言すると、コンパイラーはムーブ バージョンを生成しなくなります。

于 2012-09-24T14:47:42.723 に答える
5

すべてのコンストラクターを追跡しているわけではなく、デフォルトのコンストラクターのみを追跡しています。コンパイラはコピー コンストラクターを生成し、それを数回使用しました。これは、作成されたものではなく、破棄されたものとしてリストされている 2 つのオブジェクトを説明するためです。

于 2012-09-24T14:49:26.000 に答える
3

コピー コンストラクターの呼び出しもカウントする必要があります。C++11 では、考慮に入れる必要があるムーブ コンストラクターもあります。

于 2012-09-24T14:48:09.483 に答える