2

重複の可能性:
ポインターと参照

一部のインターフェイスでポインターの代わりに参照を使用することに利点があるかどうか疑問に思っています。より具体的に、小さな例を考えてみましょう:

struct MyInterface {
   virtual ~MyInterface() {}
   virtual void f() = 0;
};

class MyClass : public MyInterface
{
   virtual void f()
   {
      std::cout << "F()" << std::endl;
   }
};


void myFunction(MyInterface& obj);

int main(int argc, char *argv[])
{
   MyInterface* pObj = new MyClass;

   myFunction(*pObj);

   delete pObj;

   getchar();
   return 0;
}

void myFunction(MyInterface& obj)
{
   obj.f();
}

myFunction ではMyClassインスタンスをポインタとして渡すことができると、多くの本に書かれています。私の質問は、良い習慣 (ポインターまたは参照) と見なすことができるものと、より効率的なものは何ですか?

この質問が何らかの形で以前に尋ねられた場合は申し訳ありません。

4

2 に答える 2

3

値が渡されると、参照を渡すことは、パフォーマンスとセマンティクスの面で、ポインターを渡すのと同じです。あなたが書いた例では、ポインタから取得した参照を渡しているので、reference-input関数によって課せられた制限はここでは無効になっています。確かに、あなたが書いた場合

MyInterface* pObj = 0;
myFunction(*pObj);

ランタイムエラーが発生します。しかし、エラーはあなたがしているからです

myFunction( *0 );

つまり、ゼロ値を渡しているためではなく、nullポインタを逆参照しているためです。実際には、

myFunction( 0 );

コンパイル時の例外が発生します(これはすばらしいことです)。

于 2012-10-15T08:40:45.037 に答える
2

それはあなたの必要性に依存します。

ポインタを使用する:

  • 「オブジェクトなし」を渡したい可能性がある場合
  • 渡されたポインタを別の場所にポイントする機能が必要な場合
  • 何らかの理由でポインタ変数のアドレスを取得したい場合

それ以外の場合は参照を使用します。参照は、変数へのポインタというよりも、変数へのエイリアスに似ています。このセマンティクスは、コンパイラーのいくつかの可能な最適化を開き、ポインターよりも効率的にします。

于 2012-10-15T08:57:29.767 に答える