Reputation: 1322
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
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
Reputation: 575
I would try this
class Student {
public:
int gpa = 4;
Student() { };
Upvotes: 0
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
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