15

C ++で単純なオブジェクトを作成する場合、メンバーのアドレスを返すこととポインターを返すことの違いは何ですか。私の知る限り、C ++には自動ガベージコレクションがないため、参照カウントは保持されません。では、なぜ誰かがこのようにするのでしょうか。

class CRectangle {
public:
    string& getName( );
    int&    getWidth( );
    int&    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

この方法ではなく:

class CRectangle {
public:
    string* getName( );
    int*    getWidth( );
    int*    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

これらによりメンバーデータにアクセスできるようになると思いますが、この単純な例では適切なカプセル化については心配していません。では、違いは何ですか?スピードアップ?読みやすさ?スタイル?

4

4 に答える 4

22

(&このコンテキストでは) は「のアドレス」を意味するものではありません。

として宣言された関数は、ポインターではなく参照string& getName( );を返します。参照は、基本的に別のオブジェクトのエイリアスです。したがって、この場合、オブジェクトの名前のコピーや名前へのポインターは返されませんが、名前自体への参照が返されます。したがって、返されたオブジェクトへの変更は、オブジェクトの名前に直接適用されます。

ポインターを返すことで同じことを実現できますが、2 つの大きな違いがあります。

  • ポインターは、アクセスするために特別な構文 ( *and->演算子) を必要としますが、参照は、オブジェクト自体を使用するのとまったく同じ方法で使用されます。
  • ポインターは可能ですがnull、参照はできません。したがって、ポインターが使用されるときはいつでも、コードのリーダーに「この値はnull
于 2011-04-04T17:18:50.640 に答える
10

このコンテキストでは、&参照を意味します - アドレスオブではありません。

  • 正しい形式のプログラムでは、ポインターは 0 にすることができますが、参照はできません。
  • ポインターを返すと、所有権がより不明確になる場合があります。
  • 読みやすさは主観的なものです。可能な場合はリファレンスを使用してください。
  • 効率に関しては、実際の違いはありません。
于 2011-04-04T17:17:11.763 に答える
0

まず、& フォームは C++ では「参照」と呼ばれます。* 形式は「ポインタ」または「アドレス」と呼ばれます。

スピードアップ - 違いはありません。読みやすさ - おそらく参照にはわずかな利点があり、アップスタック コードでの参照解除はありません。

スタイル - カプセル化を明示的に破ることは、他のものを不明瞭にするのに十分な悪いスタイルです。裸のデータを持つオブジェクトが必要な場合は、すべて公開の構造体でも同様です。

于 2011-04-04T17:20:01.343 に答える
0

のようなプロパティ型のメソッドから整数へのポインタを返すことに、私が考えることができる利点はありませんgetWidth()。メモリの所有権を追跡する必要があるという負担が追加されます。ただし、実際には戻り値の型の帯域幅が増加する可能性があります (intと ポインターのサイズはどちらもプラットフォーム固有であり、異なる場合がありますが、一般的なサイズはそれぞれ 32 ビットと 64 ビットです)。

于 2011-04-04T17:21:52.623 に答える