【问题标题】:What's the differences between Test t; and Test t();? if Test is a class [duplicate]Test t 有什么区别?和测试 t();?如果测试是一个类[重复]
【发布时间】:2012-10-02 07:43:30
【问题描述】:

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

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

所以我想这两种方式之间肯定有一些区别。

【问题讨论】:

    标签: c++ most-vexing-parse


    【解决方案1】:

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

    Test t(); 声明了一个名为 t 的函数,它不接受任何参数并返回一个 Test

    【讨论】:

    • 图片+1 :-)
    • 好吧,多么愚蠢的问题,我敢肯定我以前就知道,但是...今天不是我的日子,:(
    • 我是唯一一个刚刚将那张照片保存到桌面的人吗?
    • 模因入侵 StackOverflow...
    【解决方案2】:

    两个声明有什么区别?

    A a(); 
    

    声明一个函数而不是一个对象。它是 C++ 中的 Most vexing parse 之一。
    它声明了一个名为 a 的函数,它不接受任何参数并返回一个类型 A

    A a;
    

    通过调用其默认构造函数来创建一个名为a 的对象A

    为什么会出现编译错误?

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2019-08-08
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多