Понимание nullptr в C ++
Рассмотрим следующую программу на C ++, которая показывает проблему с NULL (необходимость в nullptr)
// C++ program to demonstrate problem with NULL #include <bits/stdc++.h> using namespace std; // function with integer argument int fun( int N) { cout << "fun(int)" ; } // Overloaded function with char pointer argument int fun( char * s) { cout << "fun(char *)" ; } int main() { // Ideally, it should have called fun(char *), // but it causes compiler error. fun(NULL); } |
Выход:
16:13: ошибка: вызов перегруженного fun (NULL) неоднозначен веселье (NULL);
В чем проблема с вышеуказанной программой?
NULL обычно определяется как (void *) 0, и допускается преобразование NULL в целочисленные типы. Таким образом, функция вызова fun (NULL) становится неоднозначной.
// This program compiles (may produce warning) #include<stdio.h> int main() { int x = NULL; } |
Как nullptr решает проблему?
В приведенной выше программе, если мы заменим NULL на nullptr, мы получим вывод как «fun (char *)».
nullptr - это ключевое слово, которое можно использовать везде, где ожидается NULL. Как и NULL, nullptr неявно конвертируется и сравним с любым типом указателя. В отличие от NULL, он не может быть неявно преобразован или сопоставим с целочисленными типами .
// This program does NOT compile #include<stdio.h> int main() { int x = nullptr; } |
Выход:
Ошибка компилятора
Кстати, nullptr можно преобразовать в bool.
// This program compiles #include<iostream> using namespace std; int main() { int *ptr = nullptr; // Below line compiles if (ptr) { cout << "true" ; } else { cout << "false" ; } } |
Выход:
ложный
Есть некоторые неуказанные вещи, когда мы сравниваем два простых указателя, но сравнение между двумя значениями типа nullptr_t указано как, сравнение по <= и> = возвращает true, а сравнение по <и> возвращает false, а сравнение любого типа указателя с nullptr с помощью == и! = возвращает истину или ложь, если оно равно нулю или не равно нулю соответственно.
// C++ program to show comparisons with nullptr #include <bits/stdc++.h> using namespace std; // Driver program to test behavior of nullptr int main() { // creating two variables of nullptr_t type // ie, with value equal to nullptr nullptr_t np1, np2; // <= and >= comparison always return true if (np1 >= np2) cout << "can compare" << endl; else cout << "can not compare" << endl; // Initialize a pointer with value equal to np1 char *x = np1; // same as x = nullptr (or x = NULL // will also work) if (x == nullptr) cout << "x is null" << endl; else cout << "x is not null" << endl; return 0; } |
Выход :
можно сравнить x равен нулю
Эта статья предоставлена Уткаршем Триведи. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.