Cả hai đều chính xác.
Chức năng thành viên const không thể thay đổi trạng thái của đối tượng.
- Điều này có nghĩa là nó có thể đọc (nhưng không sửa đổi) tất cả các biến thành viên.
- Điều này cũng có nghĩa là nó chỉ có thể gọi các hàm thành viên const khác
Các phương pháp khác đảm bảo không thay đổi trạng thái của đối tượng.
Phía trên James cũng đề cập đến các thành viên có thể thay đổi.
Vì vậy, tôi cũng nên đề cập đến những điều đó tại đây.
Biến thành viên có thể thay đổi là biến không phải là một phần của trạng thái của đối tượng (trình biên dịch không coi đó là một phần của trạng thái đối tượng). Bạn cũng nên đối xử với nó theo cách này. Bất kỳ biến thành viên nào chứa thông tin trạng thái về đối tượng nên NOT được đánh dấu là có thể thay đổi. Bạn chỉ nên sử dụng nó để giữ thông tin tạm thời có thể được xây dựng lại từ trạng thái đối tượng.
Ví dụ đơn giản là đối tượng ngày giờ. Trường hợp đối tượng có một phương thức chuyển đổi dữ liệu/thời gian thành định dạng chuỗi có thể đọc được. Chuỗi này có thể được lưu trong bộ nhớ cache trong đối tượng trong một thành viên có thể thay đổi để có hiệu quả (do đó bạn không cần phải liên tục tạo chuỗi). Nhưng chuỗi không phải là một phần của trạng thái đối tượng (vì nó có thể được xây dựng từ các thành viên khác).
Ngoài ra, James đề cập đến việc sử dụng độ lệch đi khi sử dụng const_cast.
Ngoại trừ trong những tình huống rất đặc biệt, nơi bạn biết đối tượng KHÔNG BAO GIỜ ĐƯỢC const làm việc này được coi là một ý tưởng tồi. Vì nó dẫn trực tiếp đến hành vi không xác định. Nếu bạn thấy mình cần phải bỏ đi chòm sao thì một cái gì đó rất sai trong thiết kế đã xảy ra trong chương trình của bạn.
Thực ra tôi chỉ có thể nghĩ về một tình huống xảy ra bình thường. Và sau đó tôi không muốn cam kết nó để mã mà không cần đầu tiên đi và làm nghiên cứu để đảm bảo rằng tôi không nhìn ngớ ngẩn.
Nguồn
2009-12-27 19:43:10
Sách C++ của bạn nói gì? –
Trang web này ** là ** cuốn C++ của tôi! –
Cả hai đều chính xác. Đến một mức độ (xem bên dưới). –