首先,if (ptr)
不检查指针是否被初始化,它检查它是否不是 NULL。您可以初始化一个指向 NULL 的指针并且条件不成立。
其次,有两种情况需要处理:
1)代码逻辑允许指针是NULL
在这种情况下,您肯定希望这两种情况有不同的行为。所以合适的是:
if ( ptr )
{
ptr->foo();
//...
}
else
{
//...
}
第二种语法在语义上没有多大意义if ( ptr && ptr->foo() )
,意味着您希望ptr
在调用之前确定 is not NULL ,而不是将绑定到is notfoo()
的情况的逻辑分组到用例中。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
,所以你应该处理它,而不是把它隐藏在检查之后。