2

stackoverflow のチャット エリアで次の質問をしました。

このようにオブジェクトを作成すると、一時オブジェクトが作成され、代入演算子が呼び出されて一時オブジェクトが obj オブジェクトに割り当てられますか?

Object obj = Object( "Chris", 27 );

コンストラクターを呼び出すだけだと言われました。

ただし、コードを実行すると、次の行で dtor が呼び出されたことがコンソールに出力されます。これは、一時的なものが構築されたことを意味し、代入演算子が正しく呼び出されていることを意味するに違いありません。

それが本当なら、それはコンストラクタをこのように書くことを意味しますか

Object obj( "Chris", 22 ); 

一時的なctorとdtor、および代入演算子を回避しているため、実際にははるかに高速に実行されます。上記のようなコードを実行すると、関数の最後まで dtor 文字列がコンソールに出力されません。したがって、一時的なものは作成されていないようで、私のコードはより効率的に実行されます。

class Object
{
public:
Object()
     {
     mSize = 0;
     }
Object( string & name, int size )
     :
     mName(name),
     mSize(size)
     {
     }

~Object()
     {
     cout << "Object Dtor called" << endl;
     }
string mName;
int mSize;
};
4

3 に答える 3

2

2 番目のケースでは、コンパイラはオブジェクトを 1 回作成するように指示されます。最初のケースでは、新しいオブジェクトにコピーされる一時オブジェクトを作成するよう求めています。この場合、コンパイラは、作成-コピー-破棄をより効率的な単一オブジェクトの作成に置き換えることを決定できます。したがって、この可能性に備える必要がありますが、それに頼ることはできません。

于 2013-02-11T05:28:13.310 に答える
0

クラスが行っていることを正確に出力するようにクラスを単純に更新すると、たとえば次のようになります。

class Object
{
public:
Object()
     :
     mSize(0)
     {
     cout << "Object default Ctor called" << endl;
     }

Object(const Object & src )
     :
     mName(src.mName),
     mSize(src.mSize)
     {
     cout << "Object copy Ctor called" << endl;
     }

Object( string & name, int size )
     :
     mName(name),
     mSize(size)
     {
     cout << "Object name Ctor called" << endl;
     }

~Object()
     {
     cout << "Object Dtor called" << endl;
     }

Object& operator=(const Object &rhs)
    {
    cout << "Object Assigment Op called" << endl;
    mName = rhs.mName;
    mSize = rhs.mSize;
    }

string mName;
int mSize;
};
于 2013-02-11T09:35:05.247 に答える
0

=宣言内の は代入ではありません。代入演算子は呼び出されません。C++ の教科書があると便利です。

于 2013-02-11T05:43:26.993 に答える