15

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

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

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

4 回答 4

16

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

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

于 2011-07-21T08:14:15.960 回答
10

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

这被称为 C++ 中最令人头疼的 Parse

CMyClass mClass2(); 

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

于 2011-07-21T08:15:16.667 回答
1

第二个是函数声明。

于 2011-07-21T08:15:32.027 回答
0

人们应该使用 {} 括号来转移到 C++0x/C++11 中的统一语法初始化,这消除了这个问题。

C类{};

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

于 2011-07-21T17:34:33.803 回答