В чем разница между объектом b (); и объект б;?

Чтобы быть более точным, я получаю ошибку времени компиляции, когда пытаюсь получить доступ к переменной экземпляра, когда создаю объект с помощью (), но когда я этого не делаю, код компилируется и запускается, как и ожидалось. Кроме того, эта проблема относится только к конструктору по умолчанию.
Я хотел бы понять почему.

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

Решение

Проблема в том, что Student jack(); объявляет функцию с Student в качестве типа возврата. Он не объявляет объект этого класса, как вы ожидаете.

8

Другие решения

  Student jack();

объявляет функцию, которая возвращает студента и не принимает аргументов. Не объект!

Смотрите больше в этом gotw

6

«Объект b ();» объявляет функцию b (), возвращающую объект типа Object, тогда как «Object b;» определяет переменную b типа Object.

Нет, это не очевидно, и это все еще возвращается, чтобы укусить меня, если я переключаюсь между C ++, Java и C #. 🙂

3

В чем разница между объектом b (); и объект б;?

Разница существует, потому что C ++ интерпретирует это как объявленную функцию, а не создаваемый объект.

Object b;

Это объект b класса Object создается с помощью конструктора по умолчанию.

Object b();

Это функция b()будучи объявленным (он будет определен в другом месте) для возврата объекта класса Objectи без параметров.

Надеюсь это поможет.

2

Я бы попробовал это

ученик класса {

общественности:

int gpa = 4;

Student() { };
0
По вопросам рекламы [email protected]