布尔表达式中使用的 C++ 对象/类实例

age*_*154 1 c++ class

我正在学习 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 decoder\n");
  fclose(fout);
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,该行OurDecoder decoder(fout);正在创建一个新实例OurDecoder并调用它decoder。这(在某种程度上)相当于 Java 语法OurDecoder decoder = new OurDecoder(fout);,只不过如果我理解正确的话,这个特定的语法在堆栈上而不是在堆上分配对象。但无论如何,这不是我的问题..

我很好奇(我以前从未见过类似的东西)是这样的声明if(!decoder)。这里到底发生了什么?这和Java的类似吗if (decoder == null)

Mik*_*our 5

这意味着 或OurDecoder基类FLAC::Decoder::File具有:

  • 超载operator!()
  • 提供了一个转换运算符,例如operator bool(),以转换为某种可以用作内置运算符的操作数的!类型

请查阅类定义或文档以查找运算符及其确切含义。按照惯例,!object应该表明该对象是无效的、空的或以某种方式无法使用的。

它并不等同于 Java 的空引用检查;这是一个对象,而不是引用或指针,并且 C++ 中不存在空对象这样的东西。