Entendiendo nullptr en C++

Considere el siguiente programa C++ que muestra un problema con NULL (necesidad de nullptr)
 

CPP

// C++ program to demonstrate problem with NULL
#include <bits/stdc++.h>
using namespace std;
 
// function with integer argument
void fun(int N)   { cout << "fun(int)"; return;}
 
// Overloaded function with char pointer argument
void fun(char* s)  { cout << "fun(char *)"; return;}
 
int main()
{
    // Ideally, it should have called fun(char *),
    // but it causes compiler error.
    fun(NULL); 
}

Producción: 

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

 
¿Cuál es el problema con el programa anterior?  
NULL normalmente se define como (void *)0 y se permite la conversión de NULL a tipos integrales. Entonces, la llamada a la función fun(NULL) se vuelve ambigua. 
 

CPP

// This program compiles (may produce warning)
#include<stdio.h>
int main()
{
   int x = NULL;
}

 
¿Cómo resuelve nullptr el problema?  
En el programa anterior, si reemplazamos NULL con nullptr, obtenemos el resultado como «fun(char *)».
nullptr es una palabra clave que se puede usar en todos los lugares donde se espera NULL. Al igual que NULL, nullptr es implícitamente convertible y comparable a cualquier tipo de puntero. A diferencia de NULL, no es implícitamente convertible ni comparable a los tipos integrales .
 

CPP

// This program does NOT compile
#include<stdio.h>
int main()
{
   int x = nullptr;
}

Producción: 

Compiler Error

Como nota al margen, nullptr es convertible a bool. 
 

CPP

// This program compiles
#include<iostream>
using namespace std;
 
int main()
{
   int *ptr = nullptr;
 
   // Below line compiles
   if (ptr) { cout << "true"; }   
   else { cout << "false"; }   
}

Producción: 

false

 
       Hay algunas cosas no especificadas cuando comparamos dos punteros simples, pero la comparación entre dos valores de tipo nullptr_t se especifica como, la comparación por <= y >= devuelve verdadero y la comparación por < y > devuelve falso y compara cualquier tipo de puntero con nullptr por == y != devuelve verdadero o falso si es nulo o no nulo respectivamente. 
 

C

// 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
    // i.e., 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;
}

Producción : 

can compare
x is null

Este artículo es una contribución de Utkarsh Trivedi. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *