C++之nullptr与NULL

NULL

        `NULL` 是一个在 C/C++ 中常用的宏,用于表示空指针。它通常定义为整数 0 或者 `(void*)0`。

        在很早期的 C 语言中,并没有专门的空指针概念,因此通常使用整数 0 表示空指针。这种约定后来被保留下来,并在 C++ 中也得到了继承和使用。

        在大多数情况下,`NULL` 被用作指针变量的初始值或与指针进行比较。例如:

int* ptr = NULL;  // 初始化指针为 NULL

if (ptr == NULL) {
    // 指针为空
}

        需要注意的是,`NULL` 并不是一个关键字,而是一个宏定义。在 C++11 引入 `nullptr` 后,建议使用 `nullptr` 来表示空指针,因为它更具可读性,并且能够明确地与整数类型区分开来。

        如果你使用的是支持 C++11 或更高版本的编译器,最好使用 `nullptr` 表示空指针。但如果你需要与旧代码或库进行兼容性,使用 `NULL` 仍然是一种常见的做法。

NULL导致的二义性问题

        在早期的 C++ 版本中,通常使用整数 0 或宏 NULL 表示空指针。但这种表示方法可能存在二义性或不兼容的情况。

首先,使用整数 0 表示空指针可能会导致与整数类型的变量混淆。例如,下面的代码片段:

int* ptr = 0;

        在这里,我们把整数 0 赋值给了一个指针变量 ptr,表示它是一个空指针。然而,这种写法可能会引起歧义,因为整数 0 也是一个合法的整数值。如果我们将整数类型的变量与空指针进行比较或混合使用,就会产生二义性,使代码难以理解。

        其次,宏 NULL 的定义可能存在差异。NULL 在 C++ 中通常被定义为整数 0 或者 (void*)0。然而,不同的编译器或库可能会对 NULL 进行不同的定义,导致代码的可移植性下降。此外,使用 (void*)0 表示空指针可能会违反类型安全规则。

nullptr的引入 

        为了解决这些问题,C++11 引入了关键字 nullptr,用于表示空指针。nullptr 是一个独立的空指针常量,具有特殊的数据类型 std::nullptr_t,可以与指针类型进行类型匹配,并且不会引起二义性。

        因此,在现代的 C++ 中,推荐使用 nullptr 来表示空指针,以提高代码的可读性和可移植性。

示例1

#include 

void foo(int* ptr) {
    std::cout << "Function foo(int*): Pointer is not nullptr." << std::endl;
}

void foo(nullptr_t ptr) {
    std::cout << "Function foo(nullptr_t): Pointer is nullptr." << std::endl;
}

int main() {
    int* ptr = nullptr; // 定义int类型指针变量ptr,且该指针变量为空指针

    foo(ptr);  // 调用 foo(int*)
    foo(nullptr);  // 调用 foo(nullptr_t)  注意:此处的nullptr表示的是空指针

    return 0;
}

        在上述代码中,我们定义了两个重载的 foo 函数,一个接受 int* 类型的参数,另一个接受 nullptr_t 类型的参数。在 main 函数中,我们声明了一个指针 ptr 并将其初始化为 nullptr。然后,分别调用了 foo(ptr)foo(nullptr),可以看到输出结果会根据参数类型的不同而选择不同的函数进行调用。

输出结果应该为:

Function foo(int*): Pointer is not nullptr.
Function foo(nullptr_t): Pointer is nullptr.

nullptr的应用

`nullptr` 是 C++11 引入的关键字,用于表示空指针常量。下面是一些 `nullptr` 的应用场景:

1. 初始化指针变量:

   int* ptr = nullptr;  // 初始化指针为 nullptr

2. 判断指针是否为空:

 if (ptr == nullptr) {
       // 指针为空
   }

3. 函数重载时与其他函数进行区分:

  void foo(int* ptr) {
       // 处理非空指针情况
   }

   void foo(nullptr_t nullPtr) {
       // 处理空指针情况
   }

   foo(nullptr);  // 调用处理空指针的函数版本

示例1中我们已经应用过了!

4. 在条件语句中作为判断条件:

 if (nullptr != ptr) {
       // 指针非空时执行的代码
   }

5. 作为模板参数类型的默认值:

template 
   class MyClass {
       // 类定义
   };

        通过使用 `nullptr`,可以更明确地表示空指针,避免了使用整数 0 或宏 `NULL` 可能导致的二义性和兼容性问题。它提高了代码的可读性和可移植性,是现代 C++ 编程推荐使用的空指针表示方法。

你可能感兴趣的:(C++,c++,开发语言)