0

C++ コードで見られるメソッドのいくつかは、次の構造になっています。

void Class::method1(int &a);

次のように呼び出されます。

int a;
class->method1(a);

しかし、時々私は次のような構造を見ます:

void Class2::method2(int* a);

そして、これらのメソッドは次のように呼び出されます。

int a;
class2->method2(&a);

最初のケースではメソッドが変数のアドレスを受け入れ、2番目のケースでは変数へのポインタを受け入れることを理解していますよね?

これら2つのアプローチの違いと、どちらをいつ使用するかを誰かに説明してもらえますか?

また、最初の例では、メソッドは "int& a" または "int a" を取ることができるようですが、どちらの場合も同じように呼び出します: int a; class->method1(a); ? これは紛らわしいようです。

ありがとう。

4

4 に答える 4

1
void Class::method1(int &a);

これは参照渡しです。

void Class2::method2(int* a);

これはポインタを渡しています。は運営class2->method2(&a);&の住所です。

于 2013-06-26T14:42:10.040 に答える
0

void Class::method1(int &a)は、参照渡しaであり、呼び出し元がa変更されることを期待できることを意味します。

void Class2::method2(int* a)は、ポインターで渡していることを意味aし、呼び出し元はa変更されるポイントを期待できます。

a個人的には、参照渡しと値渡しの呼び出し構文が同じであるため、呼び出し元が変更されるかどうかをすぐに認識できないため、参照渡しは好きではありません。定数参照 による受け渡しvoid Class::method1(const int &a)a、変更することができずa、大きなオブジェクトの場合は値のコピーを取らないことで効率を上げることができるため、さらに優れています。

ただし、多くの人は意見が異なり、関数がポインターを null にできる場合はポインターで渡す必要があると言っています。aつまり、あなたの関数は入力なしで何か役に立つことができますか?

于 2013-06-26T14:45:59.373 に答える
0

最初のケースでは、メソッドは変数への参照を受け入れます。これは、 a が 内で変更された場合method1、関数が戻った後に変更されることを意味します。

2 番目のケースでは、変数へのポインターを受け入れます。ポインタは、変数のメモリ アドレスです。が&取得するものです: アドレス (別名 a へのポインター)。

どちらのタイプも本質的に同じ目的を持っています: 異なるスコープの変数を変更できることです。

その例を参照してください:

void fooPointer (int* pointer) {
    *pointer += 1;
}

void fooReference (int& reference) {
    reference += 1;
}

int main () {
    int a = 0;

    std::cout << a; // Ouputs 0

    fooPointer (&a);
    std::cout << a; // Outputs 1

    fooReference (a);
    std::cout << a; // Outputs 2
}

ご覧のとおり、どちらもここで同じことができます。しかし、参照を使用すると、すべてが暗黙的に行われるため、通常はより簡単で読みやすくなります。したがって、変数をreference( *) またはdereference( )にする必要はありません。&

于 2013-06-26T14:41:44.007 に答える
0

1 つ目は変数への参照を使用して呼び出され、2 つ目はポインターを使用して呼び出されます。2 つの概念にはいくつかの違いがあります。これをグーグルで検索することをお勧めしますが、私が今思いつく最も重要なことは、既存のオブジェクトを指さないと参照を構築できないことと、ポインターが NULL になる可能性があることです。

于 2013-06-26T14:42:09.070 に答える