私はちょうどC ++を学んでいて、Cから来て、本で見ているいくつかの関数呼び出しが私を混乱させます:
char a;
cin.get(a);
C では、これは機能しない可能性があります。それを行った場合、出力を取得する方法がありません。参照ではなく値で渡しているためです。なぜこれが c++ で機能するのですか? 参照と逆参照は暗黙的に行われますか (コンパイラーは cin.get がポインターを必要とすることを認識しているため、参照されます)?
私はちょうどC ++を学んでいて、Cから来て、本で見ているいくつかの関数呼び出しが私を混乱させます:
char a;
cin.get(a);
C では、これは機能しない可能性があります。それを行った場合、出力を取得する方法がありません。参照ではなく値で渡しているためです。なぜこれが c++ で機能するのですか? 参照と逆参照は暗黙的に行われますか (コンパイラーは cin.get がポインターを必要とすることを認識しているため、参照されます)?
C++
get()
の関数シグネチャはおそらく次のとおりであるため、これは C++ で機能します。
void get(char& a); // pass-by-reference
後の&
記号は、値char
を渡すときよりもコンパイラを示します。値のコピーを作成するのではなく、への参照を渡す必要があります。char
char
これが本質的に意味することは、メソッド内で行われた変更はメソッド外のget()
値に反映されるということです。a
の関数シグネチャget()
が次の場合:
void get(char a); // pass-by-value
thenはvaluea
で渡されます。つまり、パラメーターとしてメソッドに渡される前にのコピーが作成されます。への変更はメソッド内でのみ行われ、メソッドが戻ると失われます。a
a
ハ
これが 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
参照型はそのように機能します (値渡しではなく、参照渡し)。これは、C でポインターを渡す (ポインターによる受け渡し) に似ていますが、より優れた構文と安全性 (コンパイル時のチェック) を備えています。実装は、内部的にポインターで渡します。
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.
C++ は参照渡しを許可します (&
参照が使用されていることを示す に注意してください)。
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}