Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-如果构造函数是私有的,这将做什么?_C++_Constructor_Private_Most Vexing Parse - Fatal编程技术网

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

C++ C++;-如果构造函数是私有的,这将做什么?,c++,constructor,private,most-vexing-parse,C++,Constructor,Private,Most Vexing Parse,在下面的代码中,编译器为什么不抱怨mClass2 class CMyClass{ private: CMyClass(){} }; void TestMethod(){ CMyClass mClass1; //Fails. CMyClass mClass2(); //Works. } 因为您刚刚声明了一个零参数的函数mClass2,该函数返回CMyClass。这是一个有效的选项,因为可能存在该函数可以访问的静态CMyClass实例。请注意,CMyClass仍然有一

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

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

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

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


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

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

这在C++中被称为<强> < /强>。

CMyClass mClass2(); 

声明一个函数
mClass2()
,该函数不带参数并返回
CMyClass
第二个是函数声明。

人们应该在C++0x/C++11中使用{}括号进行统一语法初始化,从而消除此问题

C类{}


related也称为:Most-Vexing-Parse(请参阅),也是一个有效的移动构造函数。Most-Vexing-Parse-不能说我以前听说过,我会看一看,谢谢。:)