LIFE LOG(ここにはあなたのブログ名)

あつあつ備忘録

ソフトやハード、時にはメカの備忘録をまとめていきます

【C++】オブジェクト参照の引き渡し

f:id:AtsuyaKoike:20190524095847p:plain:w300

atsuyakoike.hatenablog.com

  • こちらでは、オブジェクトを関数に渡した場合は、オブジェクトのコピーが作成されることを確認している。
  • コピーなのでコンストラクタは呼ばれないがデストラクタは呼ばれる
    • 動的メモリを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行目のみ変更している。




引用・参考はこちら

f:id:AtsuyaKoike:20190524100759j:plain:w200
独習C++ 第4版 https://www.amazon.co.jp/dp/4798119768