Понимание nullptr в C ++

Опубликовано: 1 Января, 2022

Рассмотрим следующую программу на 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 равен нулю

Эта статья предоставлена Уткаршем Триведи. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++ C