Điều này chủ yếu giải quyết dòng thứ hai: thực tiễn tốt nhất, bài tập, tham số chức năng, vv
Luyện tập chung. Cố gắng làm mọi thứ const
mà bạn có thể. Hoặc để nói theo cách khác, làm cho mọi thứ const
bắt đầu, và sau đó loại bỏ chính xác bộ const
s tối thiểu cần thiết để cho phép chương trình hoạt động. Đây sẽ là một trợ giúp lớn trong việc đạt được tính chính xác và sẽ giúp đảm bảo rằng các lỗi tinh vi không được giới thiệu khi mọi người thử và gán vào những thứ mà họ không cần phải sửa đổi.
Tránh const_cast <> như bệnh dịch hạch. Có một hoặc hai trường hợp sử dụng hợp pháp cho nó, nhưng chúng rất ít và xa giữa. Nếu bạn đang cố gắng thay đổi một const
đối tượng, bạn sẽ làm tốt hơn rất nhiều để tìm bất cứ ai tuyên bố nó const
ở tốc độ đầu tiên và nói chuyện với họ để đạt được sự đồng thuận về những gì sẽ xảy ra.
Mà dẫn rất gọn gàng vào bài tập. Bạn chỉ có thể gán vào một cái gì đó nếu nó không phải là const. Nếu bạn muốn gán vào một cái gì đó là const, xem ở trên. Hãy nhớ rằng trong các tuyên bố int const *foo;
và int * const bar;
những điều khác nhau là const
- các câu trả lời khác ở đây đã đề cập đến vấn đề đó một cách đáng ngưỡng mộ, vì vậy tôi sẽ không đi sâu vào nó.
Các tham số chức năng:
Truyền theo giá trị: ví dụ: void func(int param)
bạn không quan tâm cách này hay cách khác tại trang web gọi điện. Đối số có thể được đưa ra là có các trường hợp sử dụng để khai báo hàm như void func(int const param)
nhưng điều đó không có tác dụng đối với người gọi, chỉ đối với chính hàm đó, trong đó bất kỳ giá trị nào được truyền đều không thể thay đổi bởi hàm trong suốt cuộc gọi.
Chuyển qua tham chiếu: ví dụ: void func(int ¶m)
Bây giờ nó làm cho một sự khác biệt. Như vừa tuyên bố func
được phép thay đổi param
, và bất kỳ trang web gọi điện nào cũng nên sẵn sàng để giải quyết hậu quả. Thay đổi tuyên bố để void func(int const ¶m)
thay đổi hợp đồng và đảm bảo rằng func
bây giờ không thể thay đổi param
, có nghĩa là những gì được thông qua là những gì sẽ trở lại. Như những người khác đã lưu ý rằng điều này rất hữu ích cho việc vượt qua một đối tượng lớn mà bạn không muốn thay đổi. Truyền tham chiếu rẻ hơn rất nhiều so với chuyển một đối tượng lớn theo giá trị.
Đi ngang qua con trỏ: ví dụ void func(int *param)
và void func(int const *param)
Hai là khá nhiều đồng nghĩa với các đối tác tham khảo của họ, với sự báo trước đó được gọi là chức năng hiện nay cần phải kiểm tra xem có nullptr
trừ một số đảm bảo việc bảo đảm hợp đồng khác func
mà nó sẽ không bao giờ nhận được một nullptr
trong param
.
Ý kiến về chủ đề đó. Chứng minh sự đúng đắn trong trường hợp như thế này là cực kỳ khó khăn, thật quá dễ để phạm sai lầm. Vì vậy, đừng nắm bắt cơ hội và luôn kiểm tra các tham số con trỏ nullptr
. Bạn sẽ tự cứu mình khỏi nỗi đau và đau khổ và khó tìm ra lỗi trong thời gian dài. Và đối với chi phí kiểm tra, nó rất rẻ và trong trường hợp phân tích tĩnh được tích hợp trong trình biên dịch có thể quản lý nó, trình tối ưu hóa sẽ bỏ qua nó. Bật Tạo mã thời gian liên kết cho MSVC hoặc WOPR (tôi nghĩ) cho GCC và bạn sẽ có được chương trình rộng, tức là ngay cả trong các lệnh gọi chức năng vượt qua ranh giới mô-đun mã nguồn.
Vào cuối ngày, tất cả những điều trên tạo nên một trường hợp rất chắc chắn để luôn thích tham chiếu đến con trỏ. Họ chỉ an toàn hơn tất cả các vòng.