C ++ - 如果构造函数是私有的,那么这是做什么的?

时间:2011-07-21 08:11:32

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

在下面的代码中,为什么编译器不会抱怨mClass2?

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

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

4 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:10)

因为它声明了一个函数而没有像你想象的那样调用构造函数。

这在c ++中称为 Most Vexing Parse

CMyClass mClass2(); 

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

答案 2 :(得分:1)

第二个是函数声明。

答案 3 :(得分:0)

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

C类{};

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