50 lines
No EOL
1.3 KiB
C++
50 lines
No EOL
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);
|
||
} |