ĐỪNG OVERLOAD (nạp chồng) hàm bằng cách phân biệt tham số kiểu POINTER/NUMERIC

Các bro hãy cùng xem xét ví dụ sau và xem chuyện gì xảy ra nào →

Ở đây chúng tôi thực hiện overload hàm f(), có 2 hàm cùng tên là nhưng một hàm có tham số kiểu intmột hàm lại có tham số kiểu char*. Theo các bạn thì trong chương trình trên hàm nào sẽ được call ?

Câu trả lời là hàm f(int) luôn luôn được call vì thằng compiler nó hiểu rằng 0 là một hằng số nguyên. Điều này có thể dẫn tới một số tình huống mà hàm được call lại không phải là hàm mà developer mong muốn. Trường hợp mà chúng ta hay gặp dẫn đến việc call function không đúng mong muốn thường là liên quan đến con trỏ NULL.

Việc define macro NULL là phụ thuộc vào compiler, và trước C++11 (chưa có nullptr) thì có nhiều trường hợp NULLđược define như thế này

Và nếu như rơi vào trường hợp này thì khi chúng ta gọi hàm như thế này với mong muốn là call vào hàm f(char*)

thì vì NULL chính là 0 nên khi chạy nó sẽ vẫn sẽ call vào hàm f(int) thay vì f(char*) như mong muốn.

Lưu ý: Nhấn mạnh lại 1 lần nữa là nó phụ thuộc vào compiler nên không phải lúc nào kết quả cũng như ở trên nhé. Ví dụ với compiler MinGW 7.3.0 thì khi call f(NULL) sẽ dẫn đến lỗi compile như sau →


Chốt lại mình khuyên anh em 2 điều sau →

  1. Không nên OVERLOAD hàm bằng cách phân biệt tham số kiểu pointer với numeric
  2. Từ C++11 trở đi thì hãy tạo thói quen dùng nullptr thay vì NULL

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