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

C++ object/class instance used in boolean expression

本文关键字:对象 实例 C++ 布尔表达式      更新时间:2023-10-16

我正在学习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实例隐式转换为布尔值。