1

C++ では、以下に示す実装 2 に対する実装 1 の利点は何ですか。どちらも一種の参照渡しなので、どちらの場合もメモリは HEAP から割り当てられませんか? その場合、一方が他方よりも優れている点は何ですか。

第二に、どちらの方法が優れているか - 値渡しまたは参照渡し。値による受け渡しを使用する必要がある場合と、参照による受け渡しを使用する必要がある場合。

実装 1:

main()  
{        
    struct studentInfo { int Id;  int Age; };    

    *studentInfo tom;  
    populateInfo (tom );  

    printf ("Tom's Id = %d, Age = %d\n", tom.Id, tom.Age);  
}

void populateInfo ( struct studentInfo & student )  
{  
    student.Id = 11120;  
    student.Age = 17;  
    return;  
}  

実装 2:

main()  
{  
    struct studentInfo { int Id; int Age; };   

    *studentInfo *tom = new studentInfo;
    populateInfo (tom );  

    printf ("Tom's Id = %d, Age = %d\n", tom->Id, tom->Age);  
}  

void populateInfo( struct studentInfo *student )  
{
    student->Id = 11120;  
    student->Age = 17;  
    return;  
};    
4

3 に答える 3

2

メモリ割り当ては、仮パラメータの型とは関係ありません。どちらの機能も、

void populateInfo ( struct studentInfo & student ); //1
void populateInfo ( struct studentInfo * student ); //2

ヒープまたはスタックに作成されたオブジェクトで呼び出すことができます。1 つ目はオブジェクトが既に作成されていることを意味し、2 つ目は null 引数を許可します。
オブジェクトのコピーを避けるため、通常は参照渡しの方が適しています。charただし、 、 などの組み込み型intの場合、その観点からは違いはありません。また、参照渡しでは、引数の値を変更できます。

于 2011-04-22T17:05:20.347 に答える
2

アドレス/ポインターによる受け渡しと参照による受け渡しには、おそらく主な違いが 1 つあります。

  • 参照を null にすることはできません。

どの方法が有利かは、何をする必要があるかによって異なります。

他にも、次のような影響が考えられます。

  • ポインターを渡すと、オブジェクトが変更される可能性があることが呼び出しサイトでより明確になります。これが、他のすべての条件が同じであれば、アドレス渡しの構文を好む理由だと思います。

  • 別のオブジェクトを参照するために参照を「再配置」することはできません。ポインターは、他の何かを指すようにすることができます (ObjectType* constポインターを渡さない限り、これは非常にまれです)。

  • 過負荷の解決が要因になる可能性があります。たとえば、演算子のオーバーロードを自然に機能させることが、C++ への参照を追加する動機の 1 つでした。

于 2011-04-22T17:00:16.867 に答える
0

関数は操作するオブジェクトの参照 (ポインター) のみをコピーするため、ポインターを使用した実装はよりリソース効率が高くなります。

オブジェクトを渡す実装では、オブジェクトのコピーを作成して関数で使用します (したがって、より多くのメモリを割り当てます)。

関数でオブジェクトを変更するつもりがない場合は、関数でオブジェクトへの const 参照を使用することをお勧めします。

于 2011-04-22T17:05:11.857 に答える