Kacy Raye
Kacy Raye

Reputation: 1322

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

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

}

Upvotes: 1

Views: 313

Answers (5)

sasha.sochka
sasha.sochka

Reputation: 14715

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.

Upvotes: 8

GManika
GManika

Reputation: 575

I would try this

class Student {

public:

int gpa = 4;

Student() { };

Upvotes: 0

Baltasarq
Baltasarq

Reputation: 12212

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.

Upvotes: 2

Steve
Steve

Reputation: 716

"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#. :-)

Upvotes: 3

Balog Pal
Balog Pal

Reputation: 17183

  Student jack();

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

See more in this gotw

Upvotes: 6

Related Questions