コピーコンストラクタ
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
コピーコンストラクタとは、クラスをまるごとコピーする特別なコンストラクタのことです。
コピーコンストラクタの宣言の仕方は、以下のようになります。
スポンサーリンク
class <クラス名>
{
public:
<クラス名>(const <クラス名>& <クラス自身のインスタンス>); // コピーコンストラクタ
};
まず、コピーコンストラクタの名前は、通常のコンストラクタと同様に、クラス名を名前にします。
通常のコンストラクタとの区別は、引数が違うところです。
コピーコンストラクタの引数は、クラス自身のインスタンスを参照渡しで指定し、さらにconstをつけます。
const <クラス名>& <クラス自身のインスタンス>
という引数になります。
クラスは、自分で定義できる、抽象化されたデータ型の一つであることに注意です。
参考:クラス(コンピュータ)
実際のコピーコンストラクタの処理を実装する定義は、通常のコンストラクタと同様に行います。
<クラス名>::<クラス名>(const <クラス名>& <クラス自身のインスタンス>) {
処理・・・;
}
コピーコンストラクタを定義して、動作確認をしてみる。
/***********************************
Stack
整数型のスタックを実装する
***********************************/
#include <assert.h>
#include <cstdlib>
#include <iostream>
const int STACK_SIZE = 100; // スタックの最大サイズ
/***********************************
stackクラス
整数型のスタックを実装するクラス
メンバ関数(メソッド)
init :スタック初期化
push :スタックに要素プッシュ
pop :スタックから要素ポップ
***********************************/
class stack {
public:
int count; // スタック内の要素の数
int data[STACK_SIZE]; // 要素
public:
// コンストラクタ
stack(); // voidがないことに注意
// コピーコンストラクタ
stack(const stack& obj);
// スタックに要素をプッシュ
void push(const int item);
// スタックから要素をポップ
int pop();
};
/***********************************
stack::stack
スタックの初期化コンストラクタ
************************************/
inline stack::stack() {
count = 0; // スタックの要素数を0に設定
}
/***********************************
stack::stack(const stack& obj)
スタックの初期化コピーコンストラクタ
スタックのデータ(count,data[STACK_SIZE])
をコピーする。
************************************/
inline stack::stack(const stack& obj) {
int i; // データコピーのためのインデックス
for (i = 0; i < obj.count; ++i) {
data[i] = obj.data[i];
}
count = obj.count;
}
/***********************************
stack::push
プッシュ演算。
スタックの最後に要素を追加して、
要素数をインクリメントする。
引数
item :追加する要素の値
戻り値 :なし
************************************/
inline void stack::push(const int item) {
assert((count >= 0) &&
(count <= static_cast<int>(sizeof(data)/sizeof(data[0]))));
data[count] = item;
++count;
}
/***********************************
stack_pop
ポップ演算。
スタックの先頭要素を取り出して、
要素数をデクリメントする。
戻り値 :スタックの最後の値
************************************/
inline int stack::pop() {
// スタックの要素数をデクリメント
--count;
assert((count >= 0) &&
(count < static_cast<int>(sizeof(data)/sizeof(data[0]))));
// 最後の値を返す
return (data[count]);
}
// スタックをテストするためのルーチン
int main() {
// stackを使用可能にする
stack a_stack; // stack構造体の宣言。classは省略可。
// 要素をスタックにプッシュ
a_stack.push(1);
a_stack.push(2);
a_stack.push(3);
// コピーコンストラクタでスタックのコピーを作成
stack b_stack(a_stack);
// コピーされたスタックから要素をポップ
std::cout << "b_stack:\n";
std::cout << b_stack.pop() << "\n";
std::cout << b_stack.pop() << "\n";
std::cout << b_stack.pop() << "\n";
// 元のスタックから要素をポップ
std::cout << "a_stack:\n";
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
return 0;
}
実行結果。
b_stack: 3 2 1 a_stack: 3 2 1
コピーコンストラクタにより、コピーが行われたことを確認できました。
コピーコンストラクタの理解はなかなか難しいので復習をする。
以下、後学のための資料ページ。
参考:
C++編(言語解説) 第16章 コピーコンストラクタ
スポンサーリンク
>> 次の記事 : クラスで自動的に生成されるメンバ関数
<< 前の記事 : 引数つきのコンストラクタを持つクラス定義
- - 関連記事 -
- 派生クラスのコンストラクタ・デストラクタ
- 派生クラスによる関数の隠蔽
- 仮想クラス
- 抽象クラス
- 仮想関数・virtualキーワード
- 親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
- クラスのアクセス制限キーワード・private, protected, public
- スタックを実装したクラスを拡張する
- クラス継承・親クラスと子クラス
- static・静的メンバ関数
- static・静的メンバ変数
- 定数のconstメンバ関数をクラスに宣言
- 定数のconstメンバ変数をクラスに宣言
- フレンドクラス・friend
- フレンド関数・friend
- クラスの中にメンバ関数(メソッド)を実装する
- explicit・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- 引数つきのコンストラクタを持つクラス定義
- コンストラクタで自動的に初期化する
スポンサーリンク