nullptr là gì, tại sao lại cần nullptr ?

    Trong C/C++ thì NULL là một keyword, một khái niệm rất rất quan trọng. Một trong những thứ khiến C/C++ trở nên hay ho nhưng cũng phức tạp hơn các ngôn ngữ khác đó là con trỏ. Và khi làm việc với con trỏ thì chúng ta không thể không biết đến con trỏ NULL (NULL pointer). Tuy nhiên, trong C++ thì NULL chỉ đơn giản là một macro được defined bằng 0 chứ không phải là một giá trị dành riêng cho con trỏ.

Trong hầu hết các trường hợp thì NULL vẫn hoạt động tốt, tuy nhiên trong một số trường hợp đặc biệt nó có thể dẫn tới các lỗi khù khoằm, ảo diệu. Hãy xem ví dụ sau về nạp chồng hàm trong C++ (function overloading)

Mặc dù có vẻ như hàm thứ 2 sẽ được gọi vì tham số truyền vào là con trỏ nhưng trên thực tế thì hàm đầu tiên lại được gọi. Vấn đề ở đây bắt nguồn từ việc NULL chính là 0, mà 0 là một số nguyên (integer type), do đó trình biên dịch sẽ ưu tiên lựa chọn hàm đầu tiên.

Trên thực tế làm việc thì mình rất ít gặp lỗi kiểu này, nhưng một khi nó xảy ra thì sẽ rất khó hiểu và tốn thời gian debug để tìm ra nó.

Để giải quyết vấn đề này thì từ C++11 đã có thêm từ khóa nullptr, nó được dành riêng để biểu diễn một con trỏ NULL . Nói cách khác, bất cứ chỗ nào mà trước đây bạn sử dụng NULL thì bây giờ bạn nên viết nó là nullptr.

Đối với các anh em dev thì nó chẳng có gì khác biệt, nhưng nó có ý nghĩa với trình biện dịch. Điều đó sẽ giúp chúng ta tránh được các lỗi không đáng có như ví dụ bên trên.

— Phạm Minh Tuấn (Shun) —