私は、自己定義コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子も含むサンプルクラスを持つ小さなテストプログラムを作成しました。私はコピーコンストラクタが、すべてで呼び出されていなかったことに気づいたとき、私は私がObject o1; Object o2(o1);
のように私のクラスの戻り値を持つ関数や線を実装していても、驚いた明示的なコピーコンストラクタを使用するようにコンパイラを強制するには?
innerclass.hpp:
#include <iostream>
class OuterClass
{
public:
OuterClass()
{
std::cout << "OuterClass Constructor" << std::endl;
}
~OuterClass()
{
std::cout << "OuterClass Destructor" << std::endl;
}
OuterClass(const OuterClass & rhs)
{
std::cout << "OuterClass Copy" << std::endl;
}
OuterClass & operator=(const OuterClass & rhs)
{
std::cout << "OuterClass Assignment" << std::endl;
}
class InnerClass
{
public:
InnerClass() : m_int(0)
{
std::cout << "InnerClass Constructor" << std::endl;
}
InnerClass(const InnerClass & rhs) : m_int(rhs.m_int)
{
std::cout << "InnerClass Copy" << std::endl;
}
InnerClass & operator=(const InnerClass & rhs)
{
std::cout << "InnerClass Assignment" << std::endl;
m_int = rhs.m_int;
return *this;
}
~InnerClass()
{
std::cout << "InnerClass Destructor" << std::endl;
}
void sayHello()
{
std::cout << "Hello!" << std::endl;
}
private:
int m_int;
};
InnerClass innerClass()
{
InnerClass ic;
std::cout << "innerClass() method" << std::endl;
return ic;
}
};
innerclass.cpp:
#include "innerclass.hpp"
int main(void)
{
std::cout << std::endl << "1st try:" << std::endl;
OuterClass oc;
OuterClass oc2(oc);
oc.innerClass().sayHello();
std::cout << std::endl << "2nd try:" << std::endl;
OuterClass::InnerClass ic(oc.innerClass());
ic = oc.innerClass();
}
出力:
1st try:
OuterClass Constructor
OuterClass Copy
InnerClass Constructor
innerClass() method
Hello!
InnerClass Destructor
2nd try:
InnerClass Constructor
innerClass() method
InnerClass Constructor
innerClass() method
InnerClass Assignment
InnerClass Destructor
InnerClass Destructor
OuterClass Destructor
OuterClass Destructor
A私は、コンパイラが明示的に定義されたコピーコンストラクタを使用するという保証はない、と私は読んでいます。私はこの行動を理解していません。コピーコンストラクタはなぜ呼び出されるのかわからないと、それでも存在しますか?コンパイラはそれを使用するかどうかをどのように決定しますか?
さらに、コンパイラに自己定義コピーコンストラクタを使用させる方法がありますか?
はあなたが読んでいたものにリンクすることはできますか?私は何かを誤解していると思う。 –
いくつかのコードを投稿してください。コピーコンストラクタの定義方法を確認する必要があります。 –
o1がObjectによって構成可能な他の型に暗黙的に変換されていないことを確認しますか?特定のコードがなければ、コードが失敗する理由を伝える本当の方法はありません。 –