コピーコンストラクタ

コピーコンストラクタが呼ばれる
パターンを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;
}
#include "cPosition.h"
#include <iostream>
 
int main()
{
	cPosition p1(3, 4);
	cPosition p2;
	cPosition p3 = p1;
	p1.printPosition();
	p2.printPosition();
	p3.printPosition();
}
  • game-engineer/classes/2021/game-programing-1/second-term/12/12-13-12.txt
  • 最終更新: 4年前
  • by root