测试t之间的区别是什么?和测试t();?如果测试是一个类

时间:2012-10-02 07:43:31

标签: c++ most-vexing-parse

  

可能重复:
  Why is there no call to the constructor?

我正在使用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'

所以我猜这两种方式之间肯定存在一些差异。

2 个答案:

答案 0 :(得分:50)

enter image description here

Test t;定义名为t Test的变量。

Test t();声明一个名为t的函数,该函数不带参数并返回Test

答案 1 :(得分:17)

  

两个声明之间的区别是什么?

A a(); 

声明一个函数而不是一个对象。它是C ++中 Most vexing parse 之一 它通过名称a声明一个函数,该函数不带参数并返回类型A

A a;

通过调用默认构造函数,创建类型为a的{​​{1}}对象。

  

为什么会出现编译错误?

对于类,默认访问说明符为A,因此您会收到错误,因为您的类构造函数是private,并且在使用上述语法创建对象时无法调用它。