STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

    C++11 - nullptr

    Tìm hiểu về ý nghĩa, cách sử dụng và ứng dụng về nullptr trong C++11.
    11/06/2014 15/09/2020 2 phút đọc
    C++11 - nullptr

    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ả.

    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021