Во-первых, вы должны понять разницу между классом и экземпляром, или объектом. Объект является переменной, а класс является его типом.
Таким образом, указатель не может указывать на класс. Это может указывать только на объект. Более конкретно, указатель - это адрес ячейки памяти, в которой хранится объект.
Однако вы часто слышите «указатель на класс А». Это относится к типу указателя.
Например, если вы видите int *a
, вы можете сказать «a
- указатель на целое число», что означает, что это тип переменной a
. Однако a
не указывает на тип int
, он указывает на конкретное целое число.
Аналогичным образом p1
в вашем примере имеет тип "указатель на класс hello
". Однако он может указывать только на объект class hello
, поскольку нет смысла указывать на класс.
Обратите внимание на одну важную вещь. Как вы объявили, p1
не инициализируется. Это не означает, что он равен NULL или что он указывает «никуда». Это означает, что это указывает на некоторую произвольную область памяти. Если вы попытаетесь использовать его, поведение программы непредсказуемо. Если вам повезет, вы получите ошибку сегментации, означающую, что ваша программа потерпит крах. Как правило, когда вы объявляете указатель, вы должны как можно скорее указать на него. У вас может быть что-то вроде этого:
// make p1 point to a dynamically allocated object
pointer_to_class _hello p1 = new hello;
или
// make p1 point to a local variable
hello objectOfClassHello;
pointer_to_class _hello p1 = &objectOfClassHello;