Gần như tất cả các câu trả lời khác đều đúng, nhưng chúng bỏ sót một khía cạnh của điều này: Khi bạn sử dụng phần bổ sung const
cho một tham số trong khai báo hàm, về cơ bản trình biên dịch sẽ bỏ qua nó. Trong giây lát, hãy bỏ qua sự phức tạp của ví dụ của bạn là một con trỏ và chỉ sử dụng một int
.
void foo(const int x);
khai báo chức năng tương tự như
void foo(int x);
Chỉ trong định nghĩa của hàm là const
ý nghĩa bổ sung :
void foo(const int x) {
// do something with x here, but you cannot change it
}
Định nghĩa này tương thích với một trong các khai báo ở trên. Người gọi không quan tâm đó x
làconst
chi tiết triển khai không liên quan tại trang web cuộc gọi.
Nếu bạn có một const
con trỏ tới const
dữ liệu, các quy tắc tương tự sẽ được áp dụng:
// these declarations are equivalent
void print_string(const char * const the_string);
void print_string(const char * the_string);
// In this definition, you cannot change the value of the pointer within the
// body of the function. It's essentially a const local variable.
void print_string(const char * const the_string) {
cout << the_string << endl;
the_string = nullptr; // COMPILER ERROR HERE
}
// In this definition, you can change the value of the pointer (but you
// still can't change the data it's pointed to). And even if you change
// the_string, that has no effect outside this function.
void print_string(const char * the_string) {
cout << the_string << endl;
the_string = nullptr; // OK, but not observable outside this func
}
Rất ít lập trình viên C ++ bận tâm đến việc tạo các tham số const
, ngay cả khi chúng có thể là như vậy, bất kể các tham số đó có phải là con trỏ hay không.