【问题标题】:question about the class and member function关于类和成员函数的问题
【发布时间】:2020-01-30 06:59:06
【问题描述】:

我对以下代码有疑问(c++) 它只有一行。

if (mkvparser::EBMLHeader().Parse(m_reader, pos))

这里mkvparser是命名空间,EBMLHeader在mkvparser中。

EBMLHeader() 表示构造函数,在构造完不带参数的EBMLHeader后, 然后访问 Parse 函数??

这是下面两行的快捷方式吗?

mkvparser::EBMLHeader ebmlclass();

ebmlclass.parse(m_reader, pos)

我说的对吗?

请解释一下这段代码。

总代码在下面的链接中。 https://github.com/zaps166/libsimplewebm/blob/master/WebMDemuxer.cpp

【问题讨论】:

  • 是的,你是对的。
  • mkvparser::EBMLHeader ebmlclass(); 将被视为函数声明而不是变量声明。请改用mkvparser::EBMLHeader ebmlclass;

标签: c++ class member


【解决方案1】:

对于第一种情况

mkvparser::EBMLHeader ebmlclass; //No () as it has nothing to be passed in

ebmlclass.parse(m_reader, pos)

您正在创建一个mkvparser::EBMLHeader 对象,然后在对象ebmlclass 上运行一个成员函数mkvparser::EBMLHeader::parse(...)

对于第二种情况

mkvparser::EBMLHeader().Parse(m_reader, pos)

同样,您正在创建一个mkvparser::EBMLHeader 对象,但是该对象随后运行了成员函数mkvparser::EBMLHeader::parse(...)。两者都有效地做同样的事情。但是,其中一个保留了对象ebmlclass,以后可以使用。

因此,第一种情况比您必须多次使用ebmlclass 更好,但第二种情况在可读性“紧凑性”方面更好一个案例。

请注意,对于第二种情况,在运行后,mkvparser::EBMLHeader 将被销毁,因为它超出了范围。

【讨论】:

  • 第二种情况是否类似于类中的静态成员初始化?静态成员通常在对象创建之前初始化。
  • 我不确定你的意思。 EBMLHeader() 不是静态的,它在堆栈中创建一个对象。如果 parse 是静态的,那么您将改为将其作为 mkvparser::EBMLHeader::Parse(...) 运行
猜你喜欢
  • 2010-10-08
  • 2020-12-02
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
相关资源
最近更新 更多