Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Con trỏ C++: Gán NULL, 0 hay nullptr?

Trong C++, có 3 cách gán giá trị "rỗng" cho con trỏ:

1. NULL (Macro C-style)

  • Định nghĩa: #define NULL 0 hoặc ((void*)0).
  • Bản chất là hằng số nguyên 0.
  • Vấn đề: overload resolution – NULL được xem là int, không phải pointer.

2. 0 (Literal số nguyên)

  • C++ cho phép gán 0 cho con trỏ bất kỳ – chuyển đổi ngầm thành null pointer.
  • Cùng vấn đề với NULL: là int.

3. nullptr (C++11 – Khuyến nghị)

  • Kiểu: std::nullptr_t – chỉ chuyển đổi ngầm sang con trỏ hoặc con trỏ thành viên.
  • Không chuyển đổi ngầm sang số nguyên.
  • Giải quyết ambiguity overload:
void func(int);
void func(char*);

func(0);      // gọi func(int) – không phải func(char*)!
func(NULL);   // gọi func(int) – NULL là 0
func(nullptr); // gọi func(char*) – ĐÚNG!

Ví dụ minh họa

float* p1 = NULL;   // OK, cũ
float* p2 = 0;      // OK, cũ
float* p3 = nullptr; // OK, C++11 – TỐT NHẤT

// Template deduction
template<typename T> void g(T);
g(0);        // T = int
g(nullptr);  // T = nullptr_t

Best Practice (C++11 trở đi)

  • Luôn dùng nullptr cho con trỏ null.
  • Tránh NULL và 0 trong code C++ hiện đại.
  • nullptr cũng dùng cho member pointer: int Class::*mp = nullptr;.

Tóm tắt

Giá trịKiểuChuyển đổi ngầm sangKhuyến nghị
NULLint (macro)pointer, int, bool...Tránh
0intpointer, int, bool...Tránh
nullptrstd::nullptr_tpointer, member pointer, boolDùng