2012-10-02 43 views
5

Quá tải hàm có thể xảy ra giữa hai hàm thành viên có cùng số tham số, nếu một trong số chúng được khai báo là const.quá tải hàm với tham số const

Nhưng điều gì sẽ xảy ra nếu một hàm có đối số const, một hàm khác có đối số không phải của cùng một loại? Nó có hoạt động với các tham chiếu và con trỏ không? Nếu C++ cung cấp nó, tại sao nó cung cấp? Hãy chia sẻ lý do với tôi nếu bạn biết.

Dưới đây là ví dụ giúp bạn hiểu được tình huống trên.

void fun(const int i) 
{ 
    cout << "fun(const int) called "; 
} 
void fun(int i) 
{ 
    cout << "fun(int) called " ; 
} 
int main() 
{ 
    const int i = 10; 
    fun(i); 
    return 0; 
} 

Output: Lỗi trình biên dịch: redefinition of 'void fun(int)'

void fun(char *a) 
{ 
    cout<<"non-const fun() called"; 
} 

void fun(const char *a) 
{ 
    cout<<"const fun() called"; 
} 

int main() 
{ 
    const char *ptr = "GeeksforGeeks"; 
    fun(ptr); 
    return 0; 
} 

Output: fun const() được gọi

Tại sao thứ hai cho phép trong C++?

+2

Hãy thử với 'void fun (char * const a)' – PiotrNycz

+0

Có cái gì đó vẫn còn thiếu trong câu trả lời của tôi không? Nếu có, hãy cho tôi biết, vì vậy tôi có thể cải thiện nó. :) Nếu không, tôi có thể đề nghị chấp nhận nó không? – Xeo

Trả lời

9

Tham số đầu tiên là cấp cao nhấtconst. Điều này có nghĩa là chức năng không thể thay đổi giá trị của thông số, tuy nhiên, người gọi không quan tâm: Callee nhận được bản sao đối số, vì vậy nếu tham số có cấp cao nhấtconst, đó là chi tiết triển khai. Lưu ý rằng các công trình sau đây:

void f(int); // forward declare 

void g(){ f(42); } 

void f(int const i){ /*...*/ } // define above declared function 

Đối với tập quá tải thứ hai, const không phải là cấp cao nhất nữa. Nó mô tả có hay không các callee có thể thay đổi những gì con trỏ trỏ tại. Là người gọi, bạn làm quan tâm đến điều đó. Nó không chỉ là một chi tiết thực hiện nữa.

+2

Điều đáng lưu ý là cặp với hàm thứ 3 là 'void fun (char * const a)' – PiotrNycz

Các vấn đề liên quan