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 0hoặ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
0cho 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
nullptrcho con trỏ null. - Tránh
NULLvà0trong code C++ hiện đại. nullptrcũng dùng cho member pointer:int Class::*mp = nullptr;.
Tóm tắt
| Giá trị | Kiểu | Chuyển đổi ngầm sang | Khuyến nghị |
|---|---|---|---|
NULL | int (macro) | pointer, int, bool... | Tránh |
0 | int | pointer, int, bool... | Tránh |
nullptr | std::nullptr_t | pointer, member pointer, bool | Dùng |