1

更明确地说,当我使用 () 创建对象时尝试访问实例变量时出现编译时错误,但是当我不这样做时,代码会按预期编译和运行。此外,此问题仅适用于默认构造函数。我想了解为什么。

using namespace std;
#include <iostream>

class Student {

  public:

    int gpa;

    Student() { 
      gpa = 4;
    }

    Student( int x ) { 
      gpa = x; 
    }

};

int main() {

  Student zero;
  Student sally( 2 ); 
  Student jack();

  cout << zero.gpa << endl; //prints 4
  cout << sally.gpa << endl; // prints 2
  cout << jack.gpa << endl; //error: request for member 'gpa' in 'jack', which is of non-class type 'Student()'

}
4

5 回答 5

8

问题在于Student jack();将函数声明Student为返回类型。它没有像您期望的那样声明该类的对象。

于 2013-06-28T20:46:44.853 回答
6
  Student jack();

声明一个返回 student 且不带参数的函数。不是对象!

在这个gotw中查看更多信息

于 2013-06-28T20:47:00.843 回答
3

“对象 b();” 声明一个函数 b() 返回一个 Object 类型的对象,而 "Object b;" 定义了一个 Object 类型的变量 b。

不,这并不明显,如果我在 C++、Java 和 C# 之间切换,它仍然会咬我。:-)

于 2013-06-28T20:48:06.100 回答
2

对象 b(); 有什么区别?和对象 b;?

存在差异是因为 C++ 将其解释为声明的函数,而不是创建的对象。

Object b;

这是通过默认构造函数创建b的类的对象。Object

Object b();

这是函数b(),被声明(它将在别处定义)返回一个类的对象Object,并且没有参数。

希望这可以帮助。

于 2013-06-28T20:49:47.850 回答
0

我会试试这个

班级学生{

上市:

int gpa = 4;

Student() { };
于 2013-06-28T20:49:57.597 回答