【问题标题】:C++ - What is this doing if the constructor is private?C++ - 如果构造函数是私有的,这会做什么?
【发布时间】:2011-10-10 00:36:39
【问题描述】:

在下面的代码中,为什么编译器没有报错mClass2?

class CMyClass{
private:
    CMyClass(){}
};

void TestMethod(){
    CMyClass mClass1;   //Fails.
    CMyClass mClass2(); //Works.
}

【问题讨论】:

标签: c++ constructor private most-vexing-parse


【解决方案1】:

因为你刚刚声明了一个零参数的函数mClass2,它返回一个CMyClass。这是一个有效的选项,因为可能存在该函数可以访问的 static CMyClass 实例。请注意,CMyClass 仍然有一个公共复制构造函数。

(为了说服自己,将此模块编译为汇编程序并观察注释掉 CMyClass mClass2(); 行会产生相同的输出。)

【讨论】:

  • 也是一个有效的移动构造函数。
【解决方案2】:

因为它是在声明一个函数,而不是像你想象的那样调用构造函数。

这在 c++ 中称为 Most Vexing Parse

CMyClass mClass2(); 

声明一个函数mClass2(),它不带参数并返回CMyClass

【讨论】:

  • 最令人头疼的解析 - 不能说我以前听说过,我会看看,谢谢。 :)
【解决方案3】:

第二个是函数声明。

【讨论】:

    【解决方案4】:

    人们应该改用 {} 括号在 C++0x/C++11 中进行统一语法初始化,这样可以解决这个问题。

    C类{};

    http://www2.research.att.com/~bs/C++0xFAQ.html#uniform-init

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多