null类指针(c++)中的方法
Method in null class pointer (c++)
假设我们有
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指针,这是未定义的行为。
此处讨论了此主题:检查这是否为空
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法