2011-01-14 44 views
8

Sau khi đọc this, đó là sự hiểu biết của tôi tuyên bố phương thức là const ngăn không cho nó vô tình sửa đổi các biến thành viên của lớp.Chức năng thành viên liên tục

  • Phương pháp const thường được sử dụng?
  • Chúng có nên được sử dụng cho mọi thứ không nên sửa đổi biến thành viên không?

Trả lời

14

Có, luôn luôn sử dụng const khi thích hợp.

Nó cho phép trình biên dịch của bạn kiểm tra logic ứng dụng của bạn, xác nhận tĩnh const-correctness miễn phí!

Một số người thậm chí còn nói rằng const phải là mặc định và bạn buộc phải sử dụng mutable cho những gì không cố định.

+1

Ngoài ra, bạn có thể quá tải các chức năng chỉ trên bộ định danh 'const' của hàm. Điều này cho phép, ví dụ, một toán tử chỉ mục tự động trả về phần tử theo cách chỉ đọc * nếu đối tượng được khai báo là 'const'. [* chỉ đọc chỉ áp dụng tại thời gian biên dịch. 'const' không thể làm bất cứ điều gì trong thời gian chạy] – Mephane

+0

+1 cho const-correctness. không ai khác đề cập đến nó –

+0

Tôi đang suy nghĩ về tuyên bố của bạn "const là mặc định, và có thể thay đổi cho không liên tục". Có vẻ như một vị trí cực đoan, nhưng tôi sẽ cố gắng cảm nhận những gì tôi nghĩ về nó. –

6

Tôi sử dụng const rộng rãi để truyền đạt ý định thiết kế. Nếu tôi dự định rằng một phương thức là một truy vấn thuần túy, và không phải là một hàm sửa đổi, tôi sẽ thực thi cả hai và truyền đạt nó bằng một chữ 'const' trong chữ ký.

Tôi khuyến khích bạn xem xét suy nghĩ của Meyer về vấn đề các chức năng không có tác dụng phụ và các tác động có liên quan đến việc thử nghiệm.

1

Thêm const vào một hàm thành viên cho phép nó được gọi trên tham chiếu const cho một đối tượng, bởi vì nó đảm bảo rằng các biến mẫu sẽ không bị thay đổi. Tham chiếu Const xảy ra ở nhiều nơi khác nhau trong suốt STL, do đó, nó có ý nghĩa để đánh dấu các hàm thành viên là const nơi hàm không có ý định sửa đổi trạng thái của một đối tượng.

Lưu ý: có thể đánh dấu các biến mẫu cụ thể là mutable để chúng có thể được thay đổi ngay cả bằng hàm const. Điều này rất hữu ích để thực hiện bộ đệm tìm kiếm, ví dụ.

1

Tuyên bố một phương pháp mà không nên thay đổi các biến thành viên:

  1. Đảm bảo rằng những gì bạn nghĩ là những gì đang xảy ra, ví dụ rằng bạn không vô tình sửa đổi một biến nơi nào đó.
  2. Tuyên bố cho người gọi hàm rằng phương pháp này không sửa đổi biến thành viên, loại bỏ nhu cầu đọc qua mã hoặc dựa vào tài liệu nói như vậy.

Vì vậy, có, sử dụng const ở bất kỳ đâu hợp lý. Chúng không được sử dụng rộng rãi như tôi muốn thấy mặc dù, rất có thể vì phần lớn các nhà phát triển không thấy được lợi ích to lớn.

1

Nếu bạn quên đánh dấu người truy cập là const, trình biên dịch sẽ không cho phép phương thức được gọi trên các đối tượng const hoặc tham chiếu đến các đối tượng const. Vì vậy, có, đánh dấu người truy cập là const quan trọng.

+0

Vâng, tôi biết nỗi đau khi mọi người quên khai báo getters như const. Chúng ta phải làm việc với một khung công tác ở đây hoàn toàn bỏ qua khái niệm và có mọi hàm thành viên, bao gồm cả getters, như non-const. Bây giờ chúng ta phải vượt qua con trỏ/tham chiếu như không-const bất cứ nơi nào chúng ta muốn truy cập một đối tượng như vậy, ngay cả khi chúng ta chắc chắn chỉ muốn đọc ... -_- – Mephane

1

Nếu bạn có tham chiếu const hoặc con trỏ (ví dụ: con trỏ đến const) của đối tượng lớp thì bạn CHỈ có thể gọi phương thức thành viên const của lớp.Vì vậy, nếu ai đó "quên" để thực hiện một phương pháp "get" const, bạn sẽ không thể gọi nó với một tham chiếu const (Có một cách giải quyết với const_cast nhưng chúng tôi không muốn sử dụng điều đó!).

Vì vậy, có, nếu lớp học sẽ không bị sửa đổi theo phương pháp thì nó phải là const.

Lưu ý: có một số trường hợp bạn muốn sửa đổi biến là "chi tiết triển khai", ví dụ như tải chậm hoặc khóa một mutex. Trong trường hợp này, bạn vẫn có thể tạo phương thức const nhưng làm cho biến thành viên đó "có thể thay đổi" được.

Nếu bạn đang viết một phương pháp ảo, nó sẽ là const nếu không có lớp dẫn xuất nào cần nó để có thể thay đổi được.

1

Bạn nên sử dụng từ khóa const bất cứ khi nào có thể.

Nó ngăn bạn khỏi những sai lầm trong mã.

Nó làm tăng khả năng đọc của mã rất nhiều. Mọi người đọc tiêu đề và thấy từ khóa const có thể ngay lập tức hiểu rằng phương pháp const không thay đổi trạng thái của đối tượng và có thể được sử dụng mà không sợ anh ta sẽ thay đổi đối tượng ví dụ

4

Chỉ là lời khai của tôi.

Một vài năm trước, tôi vẫn còn chống lại việc sử dụng const, chỉ vì những hạn chế trong thiết kế và viết chữ ký chức năng còn ... và vân vân ...

Nhưng một trong những nhà lãnh đạo dự án của tôi luôn luôn nhấn mạnh , luôn luôn nhắc nhở tôi: "Bạn nên sử dụng chức năng const, nó tránh tai nạn và làm không có ý nghĩa".

Và một ngày tôi gặp phải lỗi không thể để tìm. Ngày qua ngày sau ngày ... Một cơn ác mộng. Thiết kế quá lớn đối với tôi, vì vậy tôi có thể hiểu nó. Tôi đã tìm kiếm vô ích cho đến khi tôi quyết định tôi bị lạc.

Sau đó, tôi đã dành hai ngày định nghĩa lại TẤT CẢ các chức năng phải là const. Ý tôi là, hai ngày. (Recompilations miễn là nó là 5 triệu dòng mã dự án).

Và sau đó: chỉ đơn giản là tôi tìm thấy lỗi ... thay vì Compiler tìm thấy lỗi cho tôi: Trong một phương pháp getter giống như, nên đã cho tôi kích thước ưa thích của một điều khiển gui, mã đã thực sự tính toán kích thước, nhưng nó cũng là bộ nhớ đệm kích thước của nó và cập nhật kích thước của nó ... Vì vậy, sửa đổi các đối tượng.

Bây giờ, đôi khi tôi quên đặt const. Nhưng nếu tôi nhận thấy nó, tôi sửa nó.

+0

Câu chuyện âm thanh đau. :) – GManNickG

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