C++ コピーコンストラクタ
コピーコンストラクタコピーコンストラクタは特別なコンストラクタであり、オブジェクトを作成する際に、同じクラス内で以前に作成されたオブジェクトを使用して、新しく作成されたオブジェクトを初期化します。コピーコンストラクタは通常、以下の目的で使用されます:
同じ型の別のオブジェクトを使用して、新しく作成されたオブジェクトを初期化します。
オブジェクトをコピーして、関数に引数として渡します。
オブジェクトをコピーし、関数からこのオブジェクトを返します。
クラス内でコピーコンストラクタが定義されていない場合、コンパイラは自動的に定義します。クラスにポインタ変数があり、動的メモリ割り当てがある場合は、コピーコンストラクタが必要です。コピーコンストラクタの最も一般的な形式は次のとおりです:
classname (const classname &obj) {
// コンストラクタの本体
}
ここで、objは、別のオブジェクトを初期化するために使用されるオブジェクト参照です。
例
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len ); // 単純なコンストラクタ
Line( const Line &obj); // コピーコンストラクタ
~Line(); // デストラクタ
private:
int *ptr;
};
// メンバー関数の定義(コンストラクタを含む)
Line::Line(int len)
{
cout << "コンストラクタを呼び出す" << endl;
// ポインタにメモリを割り当てる
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "コピーコンストラクタを呼び出し、ポインタ ptr にメモリを割り当てます" << endl;
ptr = new int;
*ptr = *obj.ptr; // 値をコピー
}
Line::~Line(void)
{
cout << "メモリを解放" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "line のサイズ :" << obj.getLength() <<endl;
}
// プログラムのメイン関数
int main( )
{
Line line(10);
display(line);
return 0;
}
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
调用构造函数 调用拷贝构造函数并为指针 ptr 分配内存 line 大小 : 10 释放内存 释放内存
次の例は、上記の例を少し変更したもので、既存の同じ型のオブジェクトを使用して新しく作成されたオブジェクトを初期化します:
例
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len ); // 単純なコンストラクタ
Line( const Line &obj); // コピーコンストラクタ
~Line(); // デストラクタ
private:
int *ptr;
};
// メンバー関数の定義(コンストラクタを含む)
Line::Line(int len)
{
cout << "コンストラクタを呼び出す" << endl;
// ポインタにメモリを割り当てる
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "コピーコンストラクタを呼び出し、ポインタ ptr にメモリを割り当てます" << endl;
ptr = new int;
*ptr = *obj.ptr; // 値をコピー
}
Line::~Line(void)
{
cout << "メモリを解放" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "line のサイズ :" << obj.getLength() <<endl;
}
// プログラムのメイン関数
int main( )
{
Line line1(10);
Line line2 = line1; // ここでもコピーコンストラクタが呼び出されます
display(line1);
display(line2);
return 0;
}
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
调用构造函数 调用拷贝构造函数并为指针 ptr 分配内存 调用拷贝构造函数并为指针 ptr 分配内存 line 大小 : 10 释放内存 调用拷贝构造函数并为指针 ptr 分配内存 line 大小 : 10 释放内存 释放内存 释放内存その他の拡張
C++ クラス & オブジェクト