Fred(4,5) を記述するときに、ユーザー定義のコンストラクターを 1 回呼び出しています。これはベクターのコンストラクターに渡され、3 つの Fred に 3 回コピーされます。これは、デフォルトまたはカスタム コンストラクターではなく、コピー コンストラクターを使用します。独自のコピー コンストラクターを作成しない場合は、代入操作と同様に暗黙的に追加されます。以下に、舞台裏で何が追加されているかを示すために、コピー コンストラクターと代入操作を追加しました。
class Fred
{
public:
Fred(); // default constructor
Fred(int x, int y) // custom constructor
{
std::cout << "Fred with two ints\n" << std::endl;
};
Fred(const Fred&); // copy constructor
Fred& operator=(const Fred&); // assignment operator overload
};
コピー コンストラクター: Fred(const Fred&); ベクトル コンストラクターが Fred を含まれている 3 つの Fred にコピーするときに呼び出されるものです。自分で実装すると、3 回呼び出されることがわかります。完全なデモンストレーションは次のとおりです。
#include <iostream>
#include <vector>
using namespace std;
class Fred
{
private:
int x,y;
public:
Fred() // default constructor
{
cout << "Fred's default constructor\n";
}
Fred(int x, int y) // custom constructor
{
cout << "Fred's custom constructor\n" << std::endl;
};
Fred(const Fred& rhs) // copy constructor -- NOTE rhs stands for "right-hand-side"
:x(rhs.x),y(rhs.y)
{
cout << "Fred's copy constructor\n";
}
Fred& operator=(const Fred& rhs) // assignment operator overload
{
if(&rhs != this)
{
cout << "Fred's assignment overload\n";
x = rhs.x;
y = rhs.y;
}
return *this;
}
};
int main(int argc, char** argv)
{
Fred fred; // calls default constructor
vector<Fred> myFreds(3,Fred(4,5)); // calls custom constructor, then copy constructor 3 times.
fred = myFreds[0]; // calls assignment overload
return 0;
}
出力:
Fred のデフォルト コンストラクタ
Fred のカスタム コンストラクタ
Fred のコピー コンストラクタ
Fred のコピー コンストラクタ
Fred のコピー コンストラクタ
Fred の代入オーバーロード
コピー コンストラクターと代入オーバーロードを無効にすると、それらを使用しようとするとエラーが発生します。C++11 を使用している場合、上記のように宣言して無効にできる場合は、その後に = delete; を続けます。
Fred(const Fred&) = delete;
C++11 を使用しない場合は、非公開で宣言することで効果的に無効にすることができます。
private:
Fred(const Fred&); // NOTE: Don't define this function.
無効にすると、無効になっている関数にアクセスしようとするため、プログラムがコンパイルされなくなることがわかります。これらを自分で定義しないことで暗黙的に追加できるようにしたため、コンパイルされただけです。