まず、if (ptr)
ポインタが初期化されているかどうかをチェックせず、NULLでないかどうかをチェックします。NULLへのポインタを初期化できますが、条件は保持されません。
第二に、治療すべき2つのケースがあります。
1)ポインタはコードロジックによって許可されていますNULL
この場合、2つのケースで異なる動作が必要になることは間違いありません。したがって、適切なのは次のとおりです。
if ( ptr )
{
ptr->foo();
//...
}
else
{
//...
}
2番目の構文は、意味的にはあまり意味がありません。つまり、がない場合にバインドされたロジックをユースケースにグループ化するのではなく、呼び出す前にNULLでないif ( ptr && ptr->foo() )
ことを確認する必要があることを意味します。ptr
foo()
foo
false
2)ポインタは許可されていませんNULL
許可されていない場合は、完全に除外するのではなく、許可されてNULL
いる場合に対処する必要があります。NULL
if ( ptr && ptr->foo() )
します。しかし、それを燃やすことによって:
if ( !ptr )
throw std::exception("WTF! This shouldn't be NULL");
ptr && ptr->foo()
クラッシュを防ぐためのもののようですが、同時にバグを隠します。クリーンなロジックでは、をチェックする必要はありませんNULL
。オブジェクトが作成されておらず、ポインタが意味のあるものを指していない場合は、呼び出すかどうかに関係なくバグが発生するfoo
ため、チェックの背後に隠すのではなく、対処する必要があります。