2016-09-13 6 views
1
#include <stdio.h> 
    class A { 
    public: 

     int getX() { return x; } 
     private: 
     int x; 
}; 

    class B { 
     public: 
       A& getA() {return a;} 
     private: 
       A a; 
    }; 

    int main() { 
     B* b = new B; 
     if(b) { 
      b->getA().setX(10); 
      printf("\n Value is %p",&(b->getA())); 
      b->getA().setX(5); 
     } 
     return 0; 
    } 

上記のコードでは、getA()がNULLポインタまたは無効なポインタを返すことがある場合があります。はいの場合、有効なチェックは何ですか?他のクラスの中で参照によってクラスオブジェクトを返す

+1

あなたは 'stdio'と' printf'の代わりに 'iostream'と' cout'を使用しています –

+1

ヌルチェックは 'new B'の結果です。これはnullを返さず、非常に古いコンパイラを使用していない限り例外をスローします。 –

+1

参照はnullになることはありません(あなたのプログラムが既に未定義の動作を引き起こしていない限り) –

答えて

4

参照は、をnullにできません。ヌルのテストやチェックは冗長です。あなたのコンパイラはすでにそれを行います。言語を知っている人だけを混乱させます。

(明らかにこれはC++で、あなたが任意のメモリ位置に任意の値を入れることができますが、ヌルのための参照をチェックすると、他の誰かがあなたの記憶を操作している場合は、あなたを助けに行くのではありません。)

+0

私はコンパイラがnullの逆参照をキャッチしているのを見たことはありませんが、OSは一般的にそうです。 – Quentin

+0

あなたのコンパイラでは、初期化されていない参照やnullptrを残すことはできません。それが私の言いたいことです。あなたがnullptrをリファレンスにしたいのであれば、それはあなたのコンパイラがそれを許可するように欺くために大変な作業です。 – nvoigt

+0

少なくとも、(私はUBの土地に右に帆を運ぶことができます)(http://coliru.stacked-crooked.com/a/b58290d888892b5b)、些細な場合でも。私はポイントを逃していますか? – Quentin

1

あなたが本当に確認することができません参照が有効であるかどうか(また、nullでもかまいません)。したがって、参照を使用する際には、オブジェクトを使用している限り、オブジェクトが有効なままであることを確認してください(関数パラメータなど)。

参照によってオブジェクトを返すと、パフォーマンスが向上しますが、たとえば、 Bオブジェクトが破棄され、これがA&に保存されました。

可能であれば、参照を返すことを避けます(参照するオブジェクトが無効であることを確認できる場合を除き、グローバル変数など)。注意が必要な場合は参照してください。彼らはバグを見つけにくいかもしれません。

関連する問題