50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
|
#include <cstdio>
|
|||
|
|
|||
|
/*
|
|||
|
Новое специальное нулевое значение для указателя: nullptr
|
|||
|
В языке C для этой цели использовался NULL, который был просто числом 0
|
|||
|
|
|||
|
Если определить NULL так:
|
|||
|
|
|||
|
#define NULL (void*)0
|
|||
|
|
|||
|
То, в отличии от языка C, в языке C++ простая строка вида:
|
|||
|
|
|||
|
int* p = NULL;
|
|||
|
|
|||
|
не сработает, так как слева стоит int* а справа void*
|
|||
|
|
|||
|
|
|||
|
Если определить NULL так:
|
|||
|
|
|||
|
#define NULL 0
|
|||
|
|
|||
|
то в C++ могут возникнуть проблемы с перегрузкой, как это показано ниже.
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
void print(int value)
|
|||
|
{
|
|||
|
printf("Int: %d\n", value);
|
|||
|
}
|
|||
|
|
|||
|
void print(void* pointer)
|
|||
|
{
|
|||
|
printf("Pointer: %p\n", pointer);
|
|||
|
}
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
void* p1 = NULL;
|
|||
|
void* p2 = nullptr;
|
|||
|
|
|||
|
// Всё ОК (компилятор может выбрать функцию):
|
|||
|
print(p1);
|
|||
|
print(p2);
|
|||
|
|
|||
|
// Тут неверно (компилятор не может выбрать перегруженную функцию, произойдёт ошибка):
|
|||
|
print(NULL);
|
|||
|
|
|||
|
// Тут всё OK:
|
|||
|
print(nullptr);
|
|||
|
}
|