7

可能重复:
为什么没有调用构造函数?

我正在使用 Visual Studio 2012,假设 Test 是一个类

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”类中声明的私有成员

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

4

2 回答 2

50

在此处输入图像描述

Test t;定义了一个名为ttype的变量Test

Test t();声明一个被调用的函数t,它不带参数并返回一个Test.

于 2012-10-02T07:44:38.190 回答
17

两个声明有什么区别?

A a(); 

声明一个函数而不是一个对象。它是C++中最令人头疼的解析之一。
它通过名称声明一个a不带参数并返回类型的函数A

A a;

通过调用其默认构造函数 创建一个以a该类型命名的对象。A

为什么会出现编译错误?

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

于 2012-10-02T07:44:18.000 回答