オブジェクトの代入と関数への引き渡し

オブジェクトの代入と関数への引き渡し

オブジェクトの型が同じなら、あるオブジェクトを別のオブジェクトへ代入することができます。また、オブジェクトの関数への引き渡しや、アドレスの関数への引き渡しも解説します。この記事では、このオブジェクトの代入方法やオブジェクトの引き渡しをプログラム例を使いながら解説していきます。

 オブジェクトの代入

では、試しにオブジェクトを作成して代入するプログラムを作成してみましょう。以下のようにプログラムを組んでください。

#include <iostream>
using namespace std;

class myclass{
	int a;
public:
	void input(const int x){a=x;}
	int output(){return a;}
};

int main(void){
	myclass myobj1,myobj2;
	myobj1.input(3);

	myobj2=myobj1;	//ここでmyobj1をmyobj2へ代入

	cout<<myobj2.output()<<"\n";

    return 0;
}

すると以下のように表示されます。

3

このプログラムでは、

myobj2=myobj1;

によりmyobj1をmyobj2へ代入しています。ただ、値を代入しただけなので、このあと、myobj2の値を変更してもmyobj1の値は変化しません。

 オブジェクトの関数への引き渡し

変数を関数へ引き渡すのと同様に、オブジェクトを関数の引数として使用できます。例えば

#include <iostream>
using namespace std;

class myclass{
	int a;
public:
	void input(const int x){a=x;}
	int output(){return a;}
};

void myfunc(myclass obj){
	obj.input(1);
	cout<<obj.output()<<"\n";
}

int main(void){
	myclass myobj;
	myobj.input(3);
	myfunc(myobj);
	cout<<myobj.output()<<"\n";

    return 0;
}

とプログラムすると

1
3

と表示されます。ここで注意すべきことは、オブジェクトの値を関数に渡すだけなので、関数内でオブジェクトの値を操作することはできません。

この場合、

	myfunc(myobj);

で関数が実行されてオブジェクトの値が渡されます。そして

void myfunc(myclass obj){
	obj.input(1);
	cout<<obj.output()<<"\n";
}

で関数が実行されます。この関数で、obj内の変数aがinput(1)で1になり、outputで1が表示されます。

そして、main関数に戻り

	cout<<myobj.output()<<"\n";

により、以前に

	myobj.input(3);

で代入した値3がコンソールへ表示されます。

オブジェクトのアドレスを関数へ渡して値を変更する

もし、関数内で値を変更したい場合はオブジェクトのアドレスを渡さなければいけません。例えば、以下のようにしてみてください。

#include <iostream>
using namespace std;

class myclass{
	int a;
public:
	void input(int x){a=x;}
	int output(){return a;}
};

void myfunc(myclass* obj){
	obj->input(1);
	cout<<obj->output()<<"\n";
}

int main(void){
	myclass myobj;
	myobj.input(3);
	myfunc(&myobj);
	cout<<myobj.output()<<"\n";
	
    return 0;
}

こうすると

1
1

と表示されます。オブジェクトのアドレスを関数にわたして、関数側で引き受けたアドレスを使ってオブジェクトの値を書き換えています。こうすることで、myfuncによりmyobjのプロパティaの値が変更されます。

&を使ったオブジェクトの渡し方

アドレスでの渡し方には別の方法があります。それは、「&」を使用する方法です。

void myfunc(myclass &obj){
	obj.input(1);
	cout<<obj.output()<<"\n";
}

&を使用することで、関数内ではobjをアドレスではなく値として使用することができます。関数内ではアドレスではないので、メソッドinputとoutputを呼び出す際に「->」ではなく「.」を使っています。関数を使う際も

myfunc(myobj);

と呼び出すことができます。&を使った方が見やすいので、関数でオブジェクトを渡す際は「&」を使いましょう。

 

このオブジェクトやアドレスの引き渡しはよく使うのでマスターしておいてください。

著者:安井 真人(やすい まさと)