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

R4D*_*4D4 15 c++ constructor private most-vexing-parse

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

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

void TestMethod(){
    CMyClass mClass1;   //Fails.
    CMyClass mClass2(); //Works.
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 16

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

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


Alo*_*ave 10

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

这被称为c ++中令人烦恼的解析.

CMyClass mClass2(); 
Run Code Online (Sandbox Code Playgroud)

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