サーチ…


参照の定義

参照は同様に動作しますが、完全にconstポインタに似ているわけではありません。参照は、アンパサンドの接尾辞&型名に定義されます。

int i = 10;
int &refi = i;

ここでrefii束縛された参照です。
参照は、基本オブジェクトのエイリアスのように動作するポインタのセマンティクスを抽象化します。

refi = 20; // i = 20;

1つの定義に複数の参照を定義することもできます。

int i = 10, j = 20;
int &refi = i, &refj = j;

// Common pitfall :
// int& refi = i, k = j;
// refi will be of type int&.
// though, k will be of type int, not int&!

参照は定義時に正しく初期化されなければならず、後で変更することはできません。次のコードは、コンパイルエラーを引き起こします。

int &i; // error: declaration of reference variable 'i' requires an initializer

また、ポインタとは異なり、 nullptrへの参照を直接バインドすることはできません:

int *const ptri = nullptr;
int &refi = nullptr; // error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'nullptr_t'

C ++参照は既存の変数のエイリアスです

C ++のリファレンスは単なるAliasまたは変数の別の名前です。ちょうど私たちのほとんどがパスポートの名前とニックネームを使って紹介することができます。

参照は文字通り存在せず、メモリを占有しません。参照変数のアドレスを出力すると、それを参照する変数のアドレスと同じアドレスが出力されます。

int main() {
    int i = 10;
    int &j = i;
    
    cout<<&i<<endl;
    cout<<&b<<endl;
    return 0;
}

上の例では、両方のcoutが同じアドレスを出力します。関数内の参照として変数を取ると、状況は同じになります

void func (int &fParam ) {
   cout<<"Address inside function => "<<fParam<<endl;
}

int main() {
    int i = 10;
    cout<<"Address inside Main => "<<&i<<endl;    

    func(i);

    return 0;
}

この例でも、両方のcoutが同じアドレスを出力します。

C++ Referencesは単なるエイリアスであり、エイリアスが作成されるためには、エイリアスが参照できるものが必要です。

これがこのような文がコンパイラエラーを投げる正確な理由です

int &i;

なぜなら、エイリアスは何も参照していないからです。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow