2011-07-21 40 views
15

在下面的代码中,为什么编译器不会抱怨mClass2?C++ - 如果构造函数是私有的,这是干什么的?

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

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

相关http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118 –

+1

也称为:最棘手的解析(请参见http:// EN。 wikipedia.org/wiki/Most_vexing_parse) –

回答

16

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

(要说服自己,编译这个模块组装和观察注释掉行CMyClass mClass2();产生相同的输出。)

+1

此外,一个有效的移动构造函数。 – Arafangion

+0

非常感谢。 :) – R4D4

10

因为它声明一个函数,而不是调用构造函数作为你的想法。

这在C++中被称为Most Vexing Parse

CMyClass mClass2(); 

声明的函数mClass2()它没有任何参数和返回CMyClass

+0

**最令人头疼的解析** - 不能说我以前听说过,我会看看,谢谢。 :) – R4D4

+0

@ R4D4:添加链接,供您查阅:) –

1

第二个是一个函数声明。

相关问题