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

あつあつ備忘録

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

【C++】参照の返し

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

stdudy135.cpp

#include <iostream>
using namespace std;

int &f();
int x;

int main() {
    f() = 100;
    cout << x << "\n";
    return 0;
}

int &f() {
    return x;
}
$ ./study135 
100
  • f() = 100;はf()によって返される参照に100を代入している
  • return x;はxへの参照(xのアドレス)を返している。
  • 要するに、戻り地に100を代入している。

study137.cpp

#include <iostream>
#include <cstdlib>
using namespace std;

class array {
    int size;
    char *p;
public:
    array( int num );
    ~array() {
        delete [] p;
    }
    char &put( int i );
    char get( int i );
};

array::array( int num ) {
    p = new char [num];
    if( !p ) {
        cout << "メモリ割り当てエラー\n";
        exit(1);
    }
    size = num;
}

char &array::put( int i ) {
    if( i < 0 || i > size-1 ) {
        cout << "境界エラー\n";
        exit(1);
    }
    return p[i];
}

char array::get( int i ) {
    if( i < 0 || i > size-1 ) {
        cout << "境界エラー\n";
        exit(1);
    }
    return p[i];
}

int main() {
    array a(10);

    a.put(3) = 'X';
    a.put(2) = 'R';

    cout << a.get(3) << a.get(2);
    cout << "\n";

    a.put(11) = '!';

    return 0;
}
$ ./study137 
XR
境界エラー
  • array a(10);でa(0)からa(9)まで1文字ずつ代入できるオブジェクトを作成
  • a.put(3) = 'X';で、put()の返り値のp[i]に文字Xを代入。a.put(4)はR.
  • a.get(3)の返り値はp[i]なので、get()の引数に指定した数字のところの文字を取り出せる
  • if( i < 0 || i > size-1 ) で指定した場所が範囲内にあるか確かめることができる。(代入するときも出力するときも)
    • C/C++は配列のオーバーフローなどをチェックできないので、このプログラムでチェックできる。




引用・参考はこちら

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