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

あつあつ備忘録

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

【C++】関数へオブジェクトの引き渡し

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

  • 関数に引数としてデータを渡すのと同じように、オブジェクトを渡すこともできる。

study86.cpp

#include <iostream>
using namespace std;

class samp {
    int i;
public:
    samp( int n ) {
        i = n;
    }
    void set_i( int n ) {
        i = n;
    }
    int get_i() {
        return i;
    }
};

void sqr_it( samp o ) {
    o.set_i( o.get_i() * o.get_i() );
    cout << "iのコピーの値は " << o.get_i() << "\n";
}

int main() {
    samp a(10);
    sqr_it(a);

    cout << "しかし、a.iはmain()で変更されない:" <<  a.get_i() << "\n";

    return 0;
}
$ ./study86
iのコピーの値は 100
しかし、a.iはmain()で変更されない:10
  • デフォルトでは 値呼び出し で関数に渡される
  • 引数がビット単位でコピーされ、関数ではこのコピーが使われる
    • 関数の内部でオブジェクトに変更を加えても、呼び出し側のオブジェクトには影響がない
    • コピーが使われるということは、sqr_it()関数終了時にデストラクタが呼び出される。
      • つまり、デストラクタは結果的に2回呼び出される。




study87.cpp

#include <iostream>
using namespace std;

class samp {
    int i;
public:
    samp( int n ) {
        i = n;
    }
    void set_i( int n ) {
        i = n;
    }
    int get_i() {
        return i;
    }
};

void sqr_it( samp *o ) {
    o->set_i( o->get_i() * o->get_i() );
    cout << "iのコピー値は " << o->get_i() << "\n";
}

int main() {
    samp a(10);
    sqr_it(&a);
    
    cout << "今、mainは変更された:" << a.get_i() << "\n";

    return 0;
}
$ ./study87 
iのコピー値は 100
今、mainは変更された:100
  • オブジェクトのアドレスを関数に渡すと、関数を呼び出す際に使用した引数を関数内で修正できる


    引用・参考はこちら

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