2012-01-03 28 views
58

Tôi đã đọc cuốn sách C++ của tôi (Deitel) khi tôi bắt gặp một hàm để tính thể tích của khối lập phương. Mã này là như sau:Không phải là "const" dư thừa khi đi qua giá trị?

double cube (const double side){ 
    return side * side * side; 
} 

Lời giải thích cho việc sử dụng "const" vòng loại là một trong những điều này: "Các const đủ điều kiện nên được sử dụng để thực thi các nguyên tắc đặc quyền tối thiểu, nói với trình biên dịch rằng chức năng không thay đổi bên biến ".

Câu hỏi của tôi: không sử dụng "const" dư thừa/không cần thiết ở đây vì biến đang được truyền theo giá trị, vì vậy hàm không thể sửa đổi nó?

+5

Ý nghĩa của 'const' ở đây là bạn không thể sửa đổi 'tham số side' bên trong()' phương pháp khối 'để tránh những hành vi bất ngờ. –

+1

đôi khi mọi thứ có thêm về 'thực hành tốt' hơn là cần thiết. Tôi nghĩ đây là một trong những lần đó. – destan

+2

Tôi nghĩ rằng các câu trả lời đã làm một công việc tốt để giải thích lý do tại sao bạn sẽ làm điều đó, nhưng tôi sẽ chỉ thêm nó vào một người gọi bên ngoài, 'const' * là * dư thừa và không phải là một phần của chữ ký của hàm. Điều đó có nghĩa là bạn có thể để nó trong phần khai báo hàm mà không thay đổi gì cả. Bạn cũng có thể xóa nó sau này nếu vì lý do nào đó mà bạn muốn làm cho mã của bạn ít bảo trì hơn, và nó sẽ không ảnh hưởng đến mã gọi. –

Trả lời

82

Bộ định tính const ngăn mã bên trong hàm sửa đổi thông số. Khi một hàm lớn hơn kích thước tầm thường, việc bảo đảm đó sẽ giúp bạn nhanh chóng đọc và hiểu một hàm. Nếu bạn biết rằng giá trị của side sẽ không thay đổi, thì bạn không phải lo lắng về việc theo dõi giá trị của nó theo thời gian khi bạn đọc. Trong một số trường hợp, điều này thậm chí có thể giúp trình biên dịch tạo ra mã tốt hơn.

Số lượng người không tầm thường làm điều này như là một vấn đề của khóa học, xem xét nó thường phong cách tốt.

+0

Làm cho tinh thần. Cảm ơn. –

+5

Tại sao "cũng"? Đó là * tất cả * nó. –

+0

@KeithThompson - thực sự, đó là tất cả, nhưng O.P. đang nghĩ đến các tham số const ref, trong đó 'const' giữ cho bạn khỏi việc thay đổi đối tượng gốc. –

43

Bạn có thể làm một cái gì đó như thế này:

int f(int x) 
{ 
    x = 3; //with "const int x" it would be forbidden 

    // now x doesn't have initial value 
    // which can be misleading in big functions 

} 
+10

+1 để minh họa :) –

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