2016-06-05 2 views
0

после объявления указатель на int не равен NULL, тогда как указатель на класс равен NULL.указатель на класс vs указатель на встроенные типы

int *pint; 
MyClass *Myob; 
if (pint){ 
    cout << "pint is not null"; 
} 
if (!Myob){ 
    cout << "Myob is null"; 
} 

Почему не указатели на встроенные типы и указатели на классы ведут себя одинаково?

+5

Их поведение должно быть неопределенным. Вы не инициализировали свои указатели. Это также не питон. Объекты (или указатели, если на то пошло), по умолчанию, не будут «ложными», если они имеют значение null (или nullptr в этом случае). Они ничего не будут. – DarmaniLink

+2

Повысить уровень предупреждения вашего компилятора и обработать предупреждения как ошибки. –

+0

В C++ вы можете использовать интеллектуальные указатели и избегать множества проблем. Используйте их вместо –

ответ

3

Нет, указатель на как встроенный, так и тип класса имеет неопределенное значение и приведет к неопределенному поведению. В C или C++, если вы пишете

int a; 

или

int *b; 
MyClass *c; 

то, б, будет иметь неопределенное значение (или значения мусора). Если вы хотите их инициализировать как nullptr, тогда вы можете объявить их static (не очень хороший подход) или инициализировать их явно как int a = 10 или int *b = nullptr.

Вы всегда должны инициализировать указатели на NULL или nullptr (если ваш компилятор поддерживает C++ 11, назначение NULL указателям составляет deprecated).

+1

Вы всегда должны инициализировать указатели (и другие переменные). Иногда 'nullptr' является соответствующим инициализатором; в других случаях это не так. –

Смежные вопросы