C++でクラスを使用した関数へのオブジェクトの引渡しをメモ。
オブジェクトの引渡し
関数の引数にはオブジェクトを渡すことも出来る。今回はクラスを使って、オブジェクトを値渡しした場合と参照渡しをした場合の簡単なパターンをメモ。
-
値渡し(非参照型)
-
[code]
#include
using namespace std;class Sample {
int i;
public:
Sample(int n) { i = n; }
void set_int(int n) { i = n; }
int get_int() { return i ; }
};void sqr_obj(Sample obj)
{
obj.set_int(obj.get_int() * obj.get_int());cout << "func i = " << obj.get_int() << "\n"; } int main(int argc, const char * argv[]) { Sample s(10); sqr_obj(s); cout << "main i = " << s.get_int(); return 0; } [/code]
- 結果
-
[code]
func i = 100
main i = 10
[/code]※関数内で値は変化するが、元の変数の値は変わらない。
-
参照型
-
[code]
#include
using namespace std;class Sample {
int i;
public:
Sample(int n) { i = n; }
void set_int(int n) { i = n; }
int get_int() { return i ; }
};void sqr_obj(Sample *obj)
{
obj->set_int(obj->get_int() * obj->get_int());cout << "func i = " << obj->get_int() << "\n"; } int main(int argc, const char * argv[]) { Sample s(10); sqr_obj(&s); cout << "main i = " << s.get_int(); return 0; } [/code]
- 結果
-
[code]
func i = 100
main i = 100
[/code]※参照渡しすることで、元の変数の値が書き換えられる。
補足説明
- オブジェクトからクラスメンバにアクセスする場合にはドット演算子「 . 」 を使う。
- ポインタからクラスメンバにアクセスする場合にはアロー演算子「 -> 」を使う。
- 関数へ引数を参照渡しする場合にはアドレス演算子「 & 」を使う。
まとめ
今回のサンプルコードのクラスにはデストラクタが含まれてないが、関数へオブジェクトを引き渡す場合自動的にオブジェクトのコピーが生成されるため、デストラクタが最低2回(関数終了時とプログラム終了時)呼ばれるので注意。
参照渡しやポインタがよく分からないうちは「元の変数を書き換えたいなら参照渡しする」と覚えておけばいいかと思います。