【C++】オブジェクト参照の引き渡し
- こちらでは、オブジェクトを関数に渡した場合は、オブジェクトのコピーが作成されることを確認している。
- コピーなのでコンストラクタは呼ばれないがデストラクタは呼ばれる
- 動的メモリを2度以上開放することになり問題が発生することがある。
- オブジェクト参照によって解決できる
- オブジェクトを参照するとコピーが作成されないためデストラクタは実行されない
- ただし、関数内の変更が、引数に指定したオブジェクトにも反映される。
study132.cpp
#include <iostream> using namespace std; class myclass { int who; public: myclass( int n ) { who = n; cout << "コンストラクタ呼び出し" << who << "\n"; } ~myclass() { cout << "デストラクタ呼び出し" << who << "\n"; } int id() { return who; } }; void f( myclass &o ) { cout << "受け取り" << o.id() << "\n"; } int main() { myclass x(1); f(x); return 0; }
$ ./study132 コンストラクタ呼び出し1 受け取り1 デストラクタ呼び出し1 デストラクタ呼び出し1
こちらは以前と同様。デストラクタが2回呼びだされている。
study133.cpp
#include <iostream> using namespace std; class myclass { int who; public: myclass( int n ) { who = n; cout << "コンストラクタ呼び出し" << who << "\n"; } ~myclass() { cout << "デストラクタ呼び出し" << who << "\n"; } int id() { return who; } }; void f( myclass &o ) { cout << "受け取り" << o.id() << "\n"; } int main() { myclass x(1); f(x); return 0; }
$ ./study133 コンストラクタ呼び出し1 受け取り1 デストラクタ呼び出し1
19行目のみ変更している。