コピーコンストラクタが呼ばれる
パターンを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; //初期化=宣言とともに値を入れること
//↑コピーコンストラクタが呼ばれるよ
#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();
};
#include "cPosition.h"
#include <iostream>
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
<< ")" <<endl;
}
theMain.cpp
#include "cPosition.h"
#include <iostream>
int main()
{
cPosition p1(3, 4);
cPosition p2;
cPosition p3 = p1;
p1.printPosition();
p2.printPosition();
p3.printPosition();
}