====== コピーコンストラクタ ====== コピーコンストラクタが呼ばれる パターンを3つぐらい調べてみる! ・自分でコピーコンストラクタを宣言、定義しない場合は、 デフォルトのコピーコンストラクタが自動的に生成される デフォルトの動作はただのオブジェクトのコピーである! ・ただのコピーをされると困る場合は自分で書かないとだめよ! どんな時に呼ばれる? 1.オブジェクト(インスタンスを)を「ほかの初期化され たオブジェクト」使って初期化するとき。 2.関数の引数にオブジェクトを渡したとき(値渡し) 3.関数の戻り値(返り値)でオブジェクトを返したとき なので、ポインタや参照がクラスに含まれている場合は、 コピーコンストラクタに要注意! (別のインスタンスにポインタコピーされると、 メモリ共有しちゃうよ) 例) class A { public: int x, y; int *arr;//ポインタ(配列用) }; A inst1;//インスタンス1 inst1.x = 5; //代入 inst1.y = 10; //代入 inst.arr = new int[10];//配列の動的確保 A inst2 = inst1; //初期化=宣言とともに値を入れること //↑コピーコンストラクタが呼ばれるよ ==== cPosition.h ==== #pragma once class cPosition { private: int x, y; public: //インライン関数定義 void setX(int _x) { x = _x; } void setY(int _y) { y = _y; } int getX() const { return(x); } int getY() const { return(y); } cPosition(); cPosition(int _x, int _y); cPosition(const cPosition& _obj); void printPosition(); }; ==== cPosition.cpp ==== #include "cPosition.h" #include using std::cout; using std::endl; cPosition::cPosition() :x(0),y(0) { cout << "引数なしのコンストラクタ" << endl; } cPosition::cPosition(int _x, int _y) :x(_x),y(_y) { cout << "引数付きコンストラクタ" << endl; } cPosition::cPosition(const cPosition& _obj) { this->x = _obj.getX(); this->y = _obj.getY(); cout << "コピーコンストラクタ" << endl; } void cPosition::printPosition() { cout << "(" << this->x << ", " << this->y << ")" < ==== theMain.cpp ==== #include "cPosition.h" #include int main() { cPosition p1(3, 4); cPosition p2; cPosition p3 = p1; p1.printPosition(); p2.printPosition(); p3.printPosition(); }