1

私はちょうどC ++を学んでいて、Cから来て、本で見ているいくつかの関数呼び出しが私を混乱させます:

char a;
cin.get(a);

C では、これは機能しない可能性があります。それを行った場合、出力を取得する方法がありません。参照ではなく値で渡しているためです。なぜこれが c++ で機能するのですか? 参照と逆参照は暗黙的に行われますか (コンパイラーは cin.get がポインターを必要とすることを認識しているため、参照されます)?

4

4 に答える 4

11

C++

get()の関数シグネチャはおそらく次のとおりであるため、これは C++ で機能します。

void get(char& a); // pass-by-reference

後の&記号は、値charを渡すときよりもコンパイラを示します。値のコピーを作成するのではなく、への参照を渡す必要があります。charchar

これが本質的に意味することは、メソッド内で行われた変更はメソッド外のget()値に反映されるということです。a

の関数シグネチャget()が次の場合:

void get(char a); // pass-by-value

thenはvalueaで渡されます。つまり、パラメーターとしてメソッドに渡される前にのコピーが作成されます。への変更はメソッド内でのみ行われ、メソッドが戻ると失われます。aa

これが C で機能しない理由は、C にはpass-by-valueしかないためです。C で参照渡しの動作をエミュレートする唯一の方法は、そのポインターを値で渡し、メソッド内の値を変更するときにポインター値を逆参照する (したがって、同じメモリ位置にアクセスする) ことです。

void get(char* a)
{
    *a = 'g';
}

int main(int argc, char* argv[])
{
    char a = 'f';
    get(&a);
    printf("%c\n", a);

    return 0;
}

このプログラムを実行すると、次のように出力されます。

g
于 2010-02-24T04:18:21.663 に答える
4

参照型はそのように機能します (値渡しではなく、参照渡し)。これは、C でポインターを渡す (ポインターによる受け渡し) に似ていますが、より優れた構文と安全性 (コンパイル時のチェック) を備えています。実装は、内部的にポインターで渡します。

于 2010-02-24T04:17:14.740 に答える
1

This is why some C++ programmers don't like to use references like that.
It looks like a function arguement - you have no clue from the syntax whether 'a' is modified or not.

Prefer passing const references (when you have a large object and a copy would be expensive) and returning references or best of all passing pointers.

于 2010-02-24T04:22:35.587 に答える
1

C++ は参照渡しを許可します (&参照が使用されていることを示す に注意してください)。

void foo(char& bar) {
    bar = 42;
}

int main() {
    char a;
    foo(a);
    // a == 42 here
}
于 2010-02-24T04:17:30.247 に答える