[C/C++] NULL và nullptr trong C++

Như chúng ta đã biết giá trị NULL thường được gán cho con trỏ để thể hiện đó là 1 con trỏ null (con trỏ không trỏ vào địa chỉ nào).

Ví dụ:


int* iPtr = NULL;

char* cPtr = NULL;

Tuy nhiên nếu ta để ý kỹ một chút NULL trong C++ được định nghĩa:

#define NULL 0

NULL chỉ là một macro có giá trị 0, không phải là giá trị đại diện cho con trỏ null.

Đến đây ta sẽ đặt ra hai câu hỏi.

  1. Ta sử dụng NULL cho con trỏ null có vấn đề gì không?
  2. Có giá trị nào đại diện cho con trỏ null không?

Với câu hỏi thứ nhất ta có thể thấy rằng ta vẫn có thể sử dụng NULL tuy nhiên trong một số trường hợp có thể cho ta kết quả không mong muốn (xem ví dụ bên dưới)

Với câu hỏi thứ hai thì bắt đầu từ C++ 11 cung cấp cho ta nullptr, ta có thể sử dụng nullptr đại diện cho con trỏ null.

Ví dụ.


#include <iostream>

using namespace std;

void DoSomething(int* ptr)

{

   cout << "This is function with POINTER parameter!" << endl;

}

void DoSomething(int val)

{

   cout << "This is function with INT parameter!" << endl;

}

int main()

{

   DoSomething(NULL);

   DoSomething(nullptr);

   return 0;

}

Kết quả:

This is function with INT parameter!
This is function with POINTER parameter

Ở ví dụ trên khi ta gọi hàm DoSomething(NULL); trình biên dịch sẽ hiểu la ta gọi hàm DoSomething với tham số kiểu int. Còn khi ta gọi hàm DoSomething(nullptr); trình biên dịch sẽ gọi đến hàm DoSomething với tham
số kiểu con trỏ.

Kết luận : Ta nên sử dụng nullptr cho con trỏ null.

Leave A Comment?