C++の基礎:コピーコンストラクタの宣言を学ぶ
概要
C++のコンストラクタは関数であり、クラス内のメソッドですが、クラスのオブジェクトが作成されるときに自動的に呼び出される「特別なメソッド」です。プログラマがこの関数を呼び出す必要はありません。クラスの新しいオブジェクトが作成されるたびに、コンストラクタはクラスのメンバ変数を初期化したり、ストレージを割り当てたりすることができます。これが、この特別なメソッドにコンストラクタという名前が与えられている理由です。
class myclass
{
public:
myclass()
{
std::cout << "myclass is constructed!\n";
};
};
クラスにはさまざまな種類のコンストラクタがありますが、コピーコンストラクタもその1つです。コピーコンストラクタはクラスだけでなく、structやunionのデータ型でも使用されます。コピーコンストラクタとは何か、またコピーコンストラクタを宣言して使用できるメソッドの種類を知りたいと思いませんか?この記事では、コピーコンストラクタの使い方をコード例を交えて説明していきます。
クラス(class_name)のコピーコンストラクタは、第1パラメータがclass_name&、const class_name&、volatile class_name&、const volatile class_name&などの自クラスへの参照を実引数に持つコンストラクタのことです。クラスにコピーコンストラクタの宣言が無い場合は、コンパイラはコピーコンストラクタを暗黙的に定義します。
コピーコンストラクタの典型的な宣言
典型的なコピーコンストラクタを宣言する構文は以下の通りです。
class_name (const class_name &)
コピーコンストラクタを使用する構文は、以下のようにsource_classをnew_classにコピーします。
class_name new_class(source_class);
具体的なコード例は、以下の通りです。
#include <iostream>
class myclass
{
public:
int param;
myclass() // Default Constructor
{
};
myclass(const myclass& a) // Copy Constructor
{
};
};
int main()
{
myclass class1;
class1.param=100;
std::cout << class1.param << '\n' ;
// Copy Class1 to Class2 by using Copy Constructor
myclass class2(class1);
std::cout << class2.param << '\n' ;
getchar();
return 0;
}
このプログラムを実行すると、以下のような出力結果になります。
100
4358220
ご覧のとおり、このコピーコンストラクタは、クラスのプロパティとメソッドのみをコピーし、その値はコピーしません。 クラスのパラメーター(属性)の値をコピーするには、各パラメータをコピーコンストラクタに追加し、以下のように設定する必要があります。
myclass(const myclass& a) // Copy Constructor
{
param = a.param; // we need to copy properties as in here
};
したがって、この行を追加することにより、完全なコピーコンストラクタの例は以下のようになります。
#include <iostream>
class myclass
{
public:
int param;
myclass() // Default Constructor
{
};
myclass(const myclass& a) // Copy Constructor
{
param = a.param; // we need to copy values of each properties as in here
};
};
int main()
{
myclass class1;
class1.param=100;
std::cout << class1.param << '\n' ;
// Copy Class1 to Class2 by using Copy Constructor
myclass class2(class1);
std::cout << class2.param << '\n' ;
getchar();
return 0;
}
さて、このコピーコンストラクタは、クラスのプロパティやメソッドをコピーするだけでなく、ユーザーが定義した値もコピーします。結果は以下のようになります。
100
100