C++ - 如果构造函数是私有的,这会做啥?

Posted

技术标签:

【中文标题】C++ - 如果构造函数是私有的,这会做啥?【英文标题】: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.

【问题讨论】:

相关***.com/questions/4296090/… 也称为:最令人烦恼的 Parse(见en.wikipedia.org/wiki/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

【讨论】:

以上是关于C++ - 如果构造函数是私有的,这会做啥?的主要内容,如果未能解决你的问题,请参考以下文章

我们啥时候需要 C++ 中的私有构造函数?

C++构造和析构

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

拷贝构造函数(c++常问问题一)

在 C++0x 中继承构造函数

C++ - 构造函数重载 - 私有和公共