Ключевое слово 'class' в определении переменной в С++

Прежде, чем кто-нибудь спросит, да, это часть домашней работы, и да, я сделал много Googling, прежде чем спрашивать. В течение последнего часа я интенсивно искал в Google множество разных ключевых слов, но ничего не мог найти.

Итак, возникает вопрос:

Что означает следующее определение переменной: class MyClass* myClass;?

Я пробовал этот код с чем-то вроде class MyClass* myClass = new MyClass(); и обнаружил, что он просто создает указатель на новый экземпляр MyClass.

Итак, в чем преимущество использования префикса class? В чем разница?

Есть ли у кого-нибудь ссылка на некоторые ресурсы? Я просто ничего не мог найти (действительно, очень сложно найти вещи, отличные от "определения класса"!).

Спасибо большое!

Ответ 1

Спецификатор специфицированного типа - это имя типа, которому предшествует ключевое слово class, struct, enum или union.

class identifier 
struct identifier 
enum identifier 
union identifier

Разработанный спецификатор типа используется либо для выделения, либо для раскрытия имени типа, которое скрыто объявлением переменной с тем же именем в той же области.

источник

Ответ 2

На самом деле необязательно использовать class при создании объекта класса. В языке C обязательным является использование struct перед именем структуры для создания своей переменной. Поскольку С++ является надмножеством C. Существует только одно различие между структурой и классом в С++ и модификатором доступа.

Чтобы поддерживать обратную совместимость, это допустимо.

Итак,

class MyClass* myClass = new MyClass();

и

MyClass* myClass = new MyClass();

Оба одинаковы.

Ответ 3

Здесь нужно указать слова "встроенная декларация вперед"!

Прямое объявление - это просто способ сообщить компилятору о имени типа до его фактического определения. Вы находите их в файлах заголовков все время.

// MyStruct.h
class MyClass;

struct MyStuct {
   MyClass* m_myClass;
   void foo();
}

// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }

Обратите внимание, что заголовочный файл объявляет MyClass как идентификатор класса и не знает, что это на самом деле, пока он не определен с помощью #include в файле cpp. Это декларация.

встроенная декларация вперёд - это одно и то же, но вы просто делаете все это на одной строке. Это тот же самый точный код, достигающий того же самого.

// MyStruct.h
struct MyStuct {
   class MyClass* m_myClass;
   void foo();
}

// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }

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

Я вижу многие ответы здесь, назвав это необязательным ключевым словом, но в приведенном выше контексте встроенного объявления forward он очень не является необязательным и приведет к ошибкам компиляции из-за отсутствия спецификатора типа.