Danh sách bài viết về C++11
NULL là gì?
NULL
có thể bị hiểu nhầm là 1 dạng giá trị đặc biệt để đánh dấu vùng nhớ không trỏ tới đâu cả, nhưng thật sự nó lại rất đơn giản. Và NULL
xuất phát từ điều như sau #define NULL 0
. Vậy NULL
chính là đại diện của giá trị 0
. Khai báo int* p = NULL;
cũng chính là int* p = 0;
Vấn đề nảy sinh với NULL
Có thể khai báo int* p = 0;
nhưng không thể khai báo int* p = 10;
trừ phi ép kiểu int* p = (int*)10;
vì 10
là kiểu số nguyên. Và chính vì NULL
hay 0
có tính chất khá đặc biệt (không cần ép kiểu nên có thể xảy ra trường hợp gây bối rối như sau
void setSinName(int nameId) { } void setSinName(char* name) { } int main() { setSinName(NULL); return 0; }
Thật tế thì trình biên dịch trong Visual Studio 2012 đã chọn gọi hàm có đối số là kiểu int
thay vì char*
nhưng người quản lý codes này sẽ rất bối rối và có thể tự gây nhầm lẫn cho bản thân, 1 bi kịch trong thiết kế.
Vậy, nullptr
chính là giải pháp hữu hiệu để xác định và phân biệt giữa 1 loại dữ liệu đánh dấu null cho pointer và 1 giá trị NULL
(thật tế lại là giá trị 0
).
nullptr dùng riêng cho pointer
Không sử dụng kiểu khó hiểu như trên, dùng chính nullptr
để truyền vào hàm nếu muốn dùng hàm có liên quan con trỏ, giải quyết được bài toán gây bối rối này
void setSinName(int nameId) { } void setSinName(char* name) { } int main() { setSinName(nullptr); return 0; }
Cách sử dụng
// p1 nếu so sánh với p2 thì p1 == p2 int* p1 = nullptr; int* p2 = NULL; // Trình biên dịch báo lỗi vì d không phải kiểu con trỏ int d = nullptr; // Mẹo nhỏ - gán như bên dưới sẽ thành công int e = (int)nullptr; // Phép gán này thành công và b == false bool b = nullptr;
nullptr
là từ khóa, là 1 dạng literal (như true, false) dùng để đánh dấu rằng 1 pointer không có trỏ đến đâu cả.