Search…

C++11 - nullptr

15/09/20202 min read
Tìm hiểu về ý nghĩa, cách sử dụng và ứng dụng về nullptr trong C++11.

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ị 0Khai 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;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ả.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024