質問

私は C++ を学んでいるところですが、C から来たのですが、この本の中で出てくるいくつかの関数呼び出しが私を混乱させます。

char a;
cin.get(a);

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

役に立ちましたか?

解決

C++

これは C++ で機能します。 get() おそらくこれです:

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

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

これが本質的に意味するのは、内部で行われた変更はすべて get() の値に反映されます a メソッドの外にあります。

関数シグネチャの場合、 get() これはこうでした:

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

それから a 通り過ぎてしまうだろう 価値, のコピーを意味します。 a パラメータとしてメソッドに渡される前に作成されます。への変更 a この場合、メソッドのローカルのみに存在し、メソッドが返されたときに失われます。

C

これが C で機能しない理由は、C には 値渡し. 。エミュレートする唯一の方法 参照渡し 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でポインタ(ポインタによるパス)を渡すと類似するが、よりよい構文より安全(コンパイル時チェック)です。実装は、内部ポインタで渡します。

はC ++は参照によってパス(基準が使用されていることを意味&を、注意)を可能にする:

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

int main() {
    char a;
    foo(a);
    // a == 42 here
}
いくつかのC ++プログラマはそのような使用の参照を好まない理由

このです。
これは、関数のarguementのように見える - あなたは「」変更されているかどうかを構文から見当もつかない。

constの参照を渡す(あなたはラージオブジェクトとコピーを持っている場合、高価になります)、すべての合格ポインタの参照または最善を返す優先ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top