5

可能重复:
为什么使用空括号调用不带参数的构造函数是错误的?

我有小代码示例:

#include <iostream>

using namespace std;

class A
{
  public:

  void print()
  {
     cout << "Hello" << endl;
  }

};

class B: public A
{

  public:

  B() { cout << "Creating B" << endl;}

};


int main()
{

  B b();

  b.print(); // error: request for member ‘print’ in ‘b’, which is of non-class type ‘B ()()’



}

但是,如果我更改为下面的那个,如果它有效,

B* b = new B();

b->print();

为什么我在堆栈上分配对象时它不起作用?

4

2 回答 2

9

因为B b();声明了一个名为的函数,该函数b返回一个B. 只是使用B b;并指责 C++ 具有复杂语法的事实,这使得这种构造变得棘手。

于 2012-07-10T15:15:12.450 回答
4

B b();声明一个名为的函数,该函数b不接受任何内容并返回B. 奇怪?尝试将您的类重命名BInt,并命名您的“对象” f。现在看起来像

Int f();

看起来更像一个函数,不是吗?

要定义默认构造的对象,您需要:

B b;

operator new的情况下,可以使用或不使用括号调用默认构造函数:

B* b = new B;
B* b = new B();
于 2012-07-10T15:16:51.863 回答