コピーコンストラクターが呼び出されたときと代入演算子が呼び出されたときをテストするために、次のプログラムを作成しました。
#include
class Test
{
public:
Test() :
iItem (0)
{
std::cout << "This is the default ctor" << std::endl;
}
Test (const Test& t) :
iItem (t.iItem)
{
std::cout << "This is the copy ctor" << std::endl;
}
~Test()
{
std::cout << "This is the dtor" << std::endl;
}
const Test& operator=(const Test& t)
{
iItem = t.iItem;
std::cout << "This is the assignment operator" << std::endl;
return *this;
}
private:
int iItem;
};
int main()
{
{
Test t1;
Test t2 = t1;
}
{
Test t1;
Test t2 (t1);
}
{
Test t1;
Test t2;
t2 = t1;
}
}
これにより、次の出力が得られます(わかりやすくするためにempy行を追加しただけです)。
doronw @ DW01:〜$ ./test これはデフォルトのコンストラクタです これはコピーコンストラクタです これはdtorです これはdtorです これはデフォルトのコンストラクタです これはコピーコンストラクタです これはdtorです これはdtorです これはデフォルトのコンストラクタです これはデフォルトのコンストラクタです これは代入演算子です これはdtorです これはdtorです
2番目と3番目のセットは期待どおりに動作しますが、最初のセットでは、代入演算子が使用されていても、コピーコンストラクターが呼び出されます。
この動作はC++標準の一部ですか、それとも単に賢いコンパイラ最適化ですか(私はgcc 4.4.1を使用しています)