Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
La Kiến Vinh Tìm hiểu về ý nghĩa, cách sử dụng và ứng dụng về nullptr trong C++11, một lựa chọn mới mà C++ mang lại nhằm đem lại sự hiệu quả và đặc "chủng" hơn so với NULL nhằm để đánh dấu một con trỏ không trỏ tới đâu.

Giới thiệu

Thông thường ta sử dụng NULL để đánh dấu cho một con trỏ đang "không trỏ tới đâu cả", và bên dưới của NULL chính là giá trị 0. Ở C++11 chúng ta có thêm một lựa chọn mới đó là nullptr.

Tiền đề bài viết

Bài viết nhằm giới thiệu một "tính năng" mới về cách đánh dấu nullptr khi tôi gặp một số vướng mắc trong lúc codes vì sử dụng NULL. Chia sẻ để các bạn có thể tham khảo và tránh vướng mắc giống tôi.

Đối tượng hướng đến

Dành cho tất cả lập trình viên C++, lưu ý nullptr chỉ xuất hiện trong phiên bản C++11.

Danh sách bài viết về C++11

NULL là gì?

NULL có thể bị hiểu nhầm là một 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

Ta có thể khai báo int* p = 0; nhưng không thể khai báo int* p = 10; trừ phi ta é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ì tôi cũng đã kiểm tra lại và trình biên dịch trong bộ 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, một 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à một 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, ta 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ỏ, ta sẽ 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;

Kết luận

nullptr không phải là từ khóa, nó chỉ là một dạng chữ bình thường nhưng dùng để đánh dấu rằng 1 pointer không có trỏ đến đâu cả.

THẢO LUẬN
ĐÓNG