Biên tập
Như MM nhận xét, trên các tham số trong nguyên mẫu , const
bị bỏ qua. Nguồn chỉnh sửa của câu trả lời gốc (xem bên dưới) cho thấy điều này:
float correct(float const value);
float erroneous(float const value);
float changer(float value);
float correct(float value) {
return -value;
}
float erroneous(float value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Không có thông báo lỗi.
Dù sao, tôi sẽ để nguyên bản tại chỗ với hy vọng nó có thể giúp ích.
Nguyên
Các const
tại một tham số làm cho điều này tham số chỉ đọc bên trong hàm.
Ví dụ:
float correct(float const value) {
return -value;
}
float erroneous(float const value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Nguồn này sẽ không biên dịch mà không có thông báo lỗi.
Hàm correct()
sẽ đọc giá trị đã cho, thay đổi dấu của nó và trả về giá trị bị phủ định.
Hàm erroneous()
dường như thực hiện hiệu quả như nhau, ngoại trừ việc có một phép gán cho tham số. Nhưng như tham số const
này là không được phép.
Tiếp theo, chức năng changer()
sẽ hoạt động như cả hai trước, nhưng nó không có lỗi.
Hãy nhìn vào trang web cuộc gọi:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
Biến f
được đưa ra làm đối số sẽ được sao chép vào tham số value
. Nó sẽ không bao giờ thay đổi ngay cả khi changer()
sẽ được gọi.
Bạn có thể muốn xem các tham số như một số loại biến cục bộ. Trên thực tế, chúng chủ yếu được xử lý như thế này trong mã máy được tạo.
Vì vậy, tại sao const
đôi khi bạn nhìn thấy ? Bạn thấy nó nếu một con trỏ được định nghĩa là tham số.
Khi bạn không muốn thay đổi giá trị được chỉ định , bạn cần thêm const
; nhưng làm điều đó ở vị trí chính xác!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
ở đây là dư thừa, bạn tưởng tượng điều gì đang xảy ra?