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++は配列のオーバーフローなどをチェックできないので、このプログラムでチェックできる。
引用・参考はこちら
独習C++ 第4版
https://www.amazon.co.jp/dp/4798119768