What is the difference between Object b(); and Obj

2019-03-01 08:49发布

问题:

To be more explicit, I get a compile time error when I try accessing an instance variable when I create an object using (), but when I don't, the code compiles and runs as expected. Also, this problem only applies to the default constructor. I would like to understand why.

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()'

}

回答1:

The problem is that Student jack(); declares a function with Student as a return type. It doesn't declare an object of that class as you expect.



回答2:

  Student jack();

declares a function that returns student and takes no arguments. Not an object!

See more in this gotw



回答3:

"Object b();" declares a function b() returning an object of type Object, while "Object b;" defines a variable b of type Object.

No, it's not obvious, and it still comes back to bite me if I switch between C++, Java, and C#. :-)



回答4:

What is the difference between Object b(); and Object b;?

The difference exists because C++ interprets that as a function being declared, instead of an object being created.

Object b;

This is the object b of class Object being created by means of the default constructor.

Object b();

This is the function b(), being declared (it will be defined elsewhere) to return an object of class Object, and no parameters.

Hope this helps.



回答5:

I would try this

class Student {

public:

int gpa = 4;

Student() { };