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

时间:2014-04-24 15:42:42

标签: 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;
}

我了解行OurDecoder decoder(fout);正在创建OurDecoder类的新实例并将其称为decoder。这将(某种程度上)等同于Java语法OurDecoder decoder = new OurDecoder(fout);,除非我理解正确,否则这种特定语法会在堆栈中而不是在堆中分配对象。但无论如何,这不是我的问题..

我非常好奇(我之前从未见过这样的事情)是陈述if(!decoder)。引擎盖下发生了什么?这类似于Java if (decoder == null)吗?

2 个答案:

答案 0 :(得分:4)

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

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

查阅类定义或文档以查找运算符,以及它的确切含义。通常,!object应指示对象无效,空或以其他方式无法使用。

它不等同于Java检查空引用;这是一个对象,而不是引用或指针,并且C ++中没有null对象。

答案 1 :(得分:3)

根据此FLAC API documentationFLAC::Decoder::File类(或更确切地说是其基类FLAC::Decoder::Stream)会重载operator bool()。这允许decoder实例隐式转换为布尔值。