我正在使用Visual Studio 2012,假设测试是一个类
class Test
{
};
当我创建一个新的Test实例时,以下两种方式的区别是什么?
方式1
Test t;
方式2
Test t();
我在下面的代码中得到了这个问题,最初,我在方法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 ;
}
如果我定义了一个方式1
A a;
我会得到另一个错误
错误C2248:'A :: A':无法访问类中声明的私有成员 'A'
所以我猜这两种方式之间肯定存在一些差异。
答案 0 :(得分:50)
Test t;
定义名为t
Test
的变量。
Test t();
声明一个名为t
的函数,该函数不带参数并返回Test
。
答案 1 :(得分:17)
两个声明之间的区别是什么?
A a();
声明一个函数而不是一个对象。它是C ++中 Most vexing parse 之一
它通过名称a
声明一个函数,该函数不带参数并返回类型A
。
A a;
通过调用默认构造函数,创建类型为a
的{{1}}对象。
为什么会出现编译错误?
对于类,默认访问说明符为A
,因此您会收到错误,因为您的类构造函数是private
,并且在使用上述语法创建对象时无法调用它。