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

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.

  • 图片+1 :-) (20认同)
  • 我是唯一一个将照片保存到桌面的人吗? (5认同)
  • 模因入侵StackOverflow ...... (2认同)

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并且在使用上述语法创建对象时无法调用它.