我正在学习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)
吗?
答案 0 :(得分:4)
这意味着OurDecoder
或基类FLAC::Decoder::File
都有:
operator!()
或operator bool()
,以转换为某种类型,可用作内置!
运算符的操作数查阅类定义或文档以查找运算符,以及它的确切含义。通常,!object
应指示对象无效,空或以其他方式无法使用。
它不等同于Java检查空引用;这是一个对象,而不是引用或指针,并且C ++中没有null对象。
答案 1 :(得分:3)
根据此FLAC API documentation,FLAC::Decoder::File
类(或更确切地说是其基类FLAC::Decoder::Stream
)会重载operator bool()
。这允许decoder
实例隐式转换为布尔值。