Рубрики

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

Рассмотрим следующую программу на C ++, которая показывает проблему с NULL (требуется nullptr)

// C ++ программа для демонстрации проблемы с NULL
#include <bits/stdc++.h>

using namespace std;

  
// функция с целочисленным аргументом

int fun(int N)   { cout << "fun(int)"; }

  
// перегруженная функция с аргументом указателя на символ

int fun(char* s)  { cout << "fun(char *)"; }

  

int main() 

{

    // В идеале это должно было бы вызвать fun (char *),

    // но это вызывает ошибку компилятора.

    fun(NULL);  

}

Выход:

16:13: error: call of overloaded 'fun(NULL)' is ambiguous
     fun(NULL);

В чем проблема с вышеуказанной программой?
NULL обычно определяется как (void *) 0, и преобразование NULL в целочисленные типы разрешено. Поэтому функция вызова функции (NULL) становится неоднозначной.

// Эта программа компилируется (может выдавать предупреждение)
#include<stdio.h>

int main() 

{

   int x = NULL;

}

Как nullptr решает проблему?
В приведенной выше программе, если мы заменим NULL на nullptr, мы получим вывод «fun (char *)».

nullptr — это ключевое слово, которое можно использовать во всех местах, где ожидается NULL. Как и NULL, nullptr неявно конвертируем и сопоставим с любым типом указателя. В отличие от NULL, он не является неявно конвертируемым или сопоставимым с целочисленными типами .

// Эта программа НЕ компилируется
#include<stdio.h>

int main() 

{

   int x = nullptr;

}

Выход:

Compiler Error

В качестве примечания, nullptr можно преобразовать в bool.

// Эта программа компилируется
#include<iostream>

using namespace std;

  

int main() 

{

   int *ptr = nullptr;

  

   // компиляция под строкой

   if (ptr) { cout << "true"; }    

   else { cout << "false"; }    

}

Выход:

false

Существуют некоторые неопределенные вещи, когда мы сравниваем два простых указателя, но сравнение между двумя значениями типа nullptr_t указывается как, сравнение по = return true и сравнение по возвращаемому значению false и сравнение любого типа указателя с nullptr по == и! = Возвращает true или false если он равен нулю или не равен нулю соответственно.

// C ++ программа для отображения сравнений с nullptr
#include <bits/stdc++.h>

using namespace std;

  
// Драйверная программа для проверки поведения nullptr

int main()

{

    // создаем две переменные типа nullptr_t

    // т.е. со значением, равным nullptr

    nullptr_t np1, np2;

  

    // <= и> = сравнение всегда возвращает true

    if (np1 >= np2)

        cout << "can compare" << endl;

    else

        cout << "can not compare" << endl;

  

    // Инициализируем указатель со значением, равным np1

    char *x = np1;  // так же, как x = nullptr (или x = NULL

                    // тоже будет работать)

    if (x == nullptr)

        cout << "x is null" << endl;

    else

        cout << "x is not null" << endl;

  

    return 0;

}

Выход :

can compare
x is null

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

Рекомендуемые посты:

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

0.00 (0%) 0 votes