zdd*_*zdd 7 c++ most-vexing-parse
可能重复:
为什么没有调用构造函数?
我正在使用Visual Studio 2012,假设Test是一个类
class Test
{
};
Run Code Online (Sandbox Code Playgroud)
当我创建一个新的Test实例时,以下两种方式的区别是什么?
方式1
Test t;
Run Code Online (Sandbox Code Playgroud)
方式2
Test t();
Run Code Online (Sandbox Code Playgroud)
我在下面的代码中得到了这个问题,最初,我在方法2中定义了A的实例,我只得到一个错误,因为B没有提供默认构造函数,但是当我以方式1定义它时,我得到了一个额外的错误.
class B
{
B(int i){}
};
class A
{
A(){}
B b;
};
int main(void)
{
A a(); // define object a in way 2
getchar() ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
如果我定义一个方式1
A a;
Run Code Online (Sandbox Code Playgroud)
我会得到另一个错误说
错误C2248:'A :: A':无法访问在类'A'中声明的私有成员
所以我猜两种方式之间肯定存在一些差异.
Luc*_*ore 50

Test t;定义一个名为ttype 的变量Test.
Test t();声明一个t不带参数的函数,并返回一个Test.
Alo*_*ave 17
两个声明有什么区别?
A a();
Run Code Online (Sandbox Code Playgroud)
声明一个函数而不是一个对象.它是C++中最令人烦恼的解析之一.
它通过名称声明一个函数,该函数a不带参数并返回一个类型A.
A a;
Run Code Online (Sandbox Code Playgroud)
通过调用其默认构造函数创建名为a该类型的对象A.
为什么会出现编译错误?
对于类的默认访问说明符是private这样你得到错误,因为你的类构造函数是,private并且在使用上述语法创建对象时无法调用它.