にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

不定期C++勉強 - 参照型

C++は本当にちょっと忘れるとすぐ使わなくなるのに、たまになんかのアプリをコンパイル失敗したときに限ってそいつがC++で書かれてたりするから困る。
というわけで、とりあえず分からないところは調べて書き留めておく、ということで今回は参照型。
テンプレートとか名前と存在だけ知ってた、というのではなくて素で知らなかった…。

1. 参照アドレスが一度しか設定されないポインタについて(パラメータなど)、参照型は通常のポインタよりも簡潔かつ安全に記述できる。
2. 参照型は、初期化が必須であり、また一度しか初期化できない。(安全性・制限付きポインタとしての性格)
3. 参照型は、ポインタ演算はできない。(安全性・制限付きポインタとしての性格)
4. 参照型は、初期化の際、右辺に&演算子を付けずとも、変数の参照をそのまま受け取ることができる
従来のポインタによる方法のように、 関数パラメータに渡す時にいちいち&を書いてアドレスにしたり、パラメータ記述や受け取った後にいちいち*を書いてアクセスしなければならない記述上の手間と、読みにくさから開放される効果があります。

C++言語/参照型 - 吉野情報技研(jack'slab)

だそうですが、ポインタと同じことができるのなら記法を追加する必要はないんではないですかね?と思って以下のようなサンプルで動作を試してみたが、こんなに短いコードにも関わらずポインタの方の記述を2回も間違えた。参照型を用いる効果はあるようです。

#include <iostream>
using namespace std;

void func(int n) {
    n++;
}

void func_ptr(int *n) {
    (*n)++;
}

void func_ref(int& n) {
    n++;
}

int main(int argc, char *argv[])
{
    int x=10, y=10, z=10;

    func(x);
    cout << x << endl;

    func_ptr(&y);
    cout << y << endl;

    func_ref(z);
    cout << z << endl;

    return 0;
}

実行結果

$ ./ex03cpp
10
11
11

そして、UPする前に気づいたがC++でも標準出力関数はついついprintfを使ってしまう。