ぷろみん

プログラミング的な内容を扱ってます

ポインタよりも参照を使おう

あんまり関係の無い所

int& aint &aのどちらで書くでしょうか?
私はint &aの方で書きます。

    // int i;
    // int *ip;
    // int *const ipc = &i;
    // int &ir = i;
    int i, *ip, *const ipc = &i, &ir = i;
    // const int ci = 0;
    // const int *cip;
    // const int *const cipc = nullptr;
    // const int &cir = i;
    const int ci = 0, *cip, *const cipc = nullptr, &cir = i;
    // int constでも良い

上記の様に最初のint&の関連性が低い為です。

    int a = 0;

    // 間違えそう!
    // int &b = a;
    // int c = a;
    int& b = a, c = a;

特性に注目する

int main(){
    int i, *ip, *const ipc = &i, &ir = i;
    const int ci = 0, *cip, *const cipc = nullptr, &cir = i;
    
    // mutable
    i = 0;
    ip = &i;
    cip = &i;
    
    // writeable
    *ip = 0;
    *ipc = 0;
    ir = 0;
}

mutableな変数は自身の値を再代入できます。
writeableな変数は他の変数の値を書き換える事ができます。

ここで紛らわしいのがiciです。
imutableなばかりに先頭にconstを付けた場合、変数の変更ができないように考えてしまいます。

先頭にconstを付ける事によってwriteableでは無くなり、*constを付ける事によってmutableでは無くなると考えると分かりやすいです。

参照は分かりやすい

この特性で参照を考えると参照は非常に分かりやすいです。
参照はmutableではありません。
int &irwriteableです。
const int &cirwriteableではありません。

分かりやすい!