布尔表达式中使用的C++对象/类实例
C++ object/class instance used in boolean expression
我正在学习C++的细节,同时尝试阅读和解析一些FLAC源代码(我目前只知道Java和C#),我发现了这个:
class OurDecoder: public FLAC::Decoder::File {
public:
OurDecoder(FILE *f_): FLAC::Decoder::File(), f(f_) { }
protected:
FILE *f;
...
};
OurDecoder decoder(fout);
if(!decoder) {
fprintf(stderr, "ERROR: allocating decodern");
fclose(fout);
return 1;
}
我知道行OurDecoder decoder(fout);
正在创建OurDecoder
类的一个新实例,并将其称为decoder
。这(在某种程度上)相当于Java语法OurDecoder decoder = new OurDecoder(fout);
,只是如果我理解正确的话,这种特定的语法会在堆栈上而不是堆中分配对象。但不管怎样,这不是我的问题。。
我非常好奇的是if(!decoder)
语句(我以前从未见过这样的语句)。引擎盖下面发生了什么事?这类似于Java的if (decoder == null)
吗?
这意味着OurDecoder
或基类FLAC::Decoder::File
都有:
- 过载
operator!()
或 - 提供了一个转换运算符,如
operator bool()
,以转换为某种类型,该类型可以用作内置!
运算符的操作数
查阅类定义或文档以查找运算符,以及它的确切含义。按照惯例,!object
应该指示对象无效、为空或以某种方式不可用。
它并不等同于Java对空引用的检查;这是一个对象,而不是引用或指针,在C++中没有null对象。
根据此FLAC API文档,FLAC::Decoder::File
类(或者更确切地说是其基类FLAC::Decoder::Stream
)重载operator bool()
。这允许将decoder
实例隐式转换为布尔值。
相关文章:
- 对象实例化调用构造函数的次数太多
- 为什么C++无法识别我的对象实例化?
- 使用大括号和 : 符号的对象实例化
- 对象实例化与类型C++
- 如何在C++中传递lambda函数内部的对象实例
- 在 c++ 中重置大型对象实例的最佳方法是什么
- 从 QT Widget 对象实例访问 QT Widget 子成员
- C++阻止用户创建对象实例
- cpp 静态对象实例化
- C++:根据变量将同一对象实例化为多种类型之一
- 与 QML 共享C++对象实例
- C 对象实例被销毁后留在列表上
- vulkan vulkan.hpp从对象实例中获取opbject类型
- 用户创建的类对象实例化的未申请标识符
- 对象实例化后不输出
- 限制对象实例化堆
- C C#等价对象实例
- 在C 中运行时从指针访问对象实例
- 使用类/对象实例数据初始化对话框
- 未知的 C++ 对象实例化语法