読者です 読者をやめる 読者になる 読者になる

参照のこと

ん、少なくとも一個抜けてると思うな :)

404 Not Found

ぐは。
すみません。orz

・再代入できない(既にある参照を別の要素を指す参照にすることはできない
ってことかしら……。

加えて、参照を用いると
関数の呼び出しがlvalueになれるのも良い。

これは、参照を返すメンバ関数であるHogeがある場合、
Hoge()=0;
のようなソースコードを赦すが、
これはoperatorの実装に必要不可欠な要素である。

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

class Hoge {
public:
    Hoge() {}
    int& operator[] (unsigned int i) throw(out_of_range);
private:
    int data_[100];
};

int& Hoge::operator[] (unsigned int i)
throw(out_of_range)
{
    if (i >= 100) {
        throw out_of_range("index is out of range!");
    }
    return data_[i];
}

int main()
{
    Hoge hoge;
    
    hoge[0] = 999;
    
    
    cout << hoge[0] << endl;
    
    return 0;
}

というコードがある場合、
hoge[0] = 999
は、
hoge.operator[](0) = 999;
ということである。
lvalueになれないとこういうことができないし、
ポインタでも実現できない。

多分あろはさんとかodzさんあたりがびしっと決めてくれるだろう

わくわくてかてか。

C++は C からポインタを受け継ぎました。したがって、重大な互換性の問題を 起こさずにポインタを取り除くことはできませんでした。リファレンスはいくつか の事柄に役に立ちますが、リファレンスをC++に導入した直接の理由は、演算子の オーバーロードをサポートするためでした。 以下に例を示します。

Stroustrup: C++ Style and Technique FAQ 日本語訳

すっぽすっぽ曰く。

また、結合変え(再代入)ができないのは、
Algol68のリファレンスで、懲りたからだそう。
Algol68では、
r1=r2
と書いた場合、
1.r1が参照しているオブジェクトへの代入
2.新しい参照の値をr1に代入(r1の結合変え)
の二つの意味を持つ。(どちらになるかはr2のタイプに依存する
これを避けたかったんだそうだ。

C++の設計と進化

C++の設計と進化