null类指针(c++)中的方法

Method in null class pointer (c++)

本文关键字:方法 c++ 指针 null      更新时间:2023-10-16

假设我们有

class Foo{
public:
       bool   error;
       ......
       bool isValid(){return error==false;}
};

Foo *aFoo=NULL;

我通常会做if (aFoo!=NULL && aFoo->isValid()).....

但是如果在isValid方法中我测试无效性:

bool isValid(){return this!=NULL && error==false)

这将通过简单地调用if (aFoo->isValid()) 来简化外部测试

我在一些编译器中测试过它,它确实有效,但我想知道它是否是标准的,并且在移植到其他环境时可能会出现问题。

编译器可以自由地优化检查——通过无效(或NULL指针)调用任何类的任何非静态成员都是未定义的行为。请不要这样做。

为什么不简单地使用这样的命名空间作用域函数呢?

bool isValid(Foo* f) {return f && f->isValid();}

类似的if-语句

if (aFoo->isValid())

意味着指针指向一个有效的对象。这将是一个巨大的混乱来源,而且非常容易出错。

最后,您的代码确实会调用未定义的行为——根据定义,aFoo->isValid相当于(*aFoo).isValid:

N3337,§5.2.5/2

表达式E1->E2转换为等效形式(*(E1)).E2

它将取消引用空指针以获得空引用,这显然是未定义的:

N3337,§8.3.2/5

[注意:特别是,null引用不能存在于定义良好的程序中,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的"object",这会导致未定义的行为。[…]-尾注]

一般来说,这将是一个糟糕的设计,在标准C++中,这没有多大意义,因为您的内部NULL检查意味着您将调用一个NULL指针,这是未定义的行为。

此处讨论了此主题:检查这是否为空