Điều này được thảo luận trong "Hiệu quả C++" của Scott Meyer. Lý do này là mơ hồ là họ muốn đảm bảo rằng chỉ đơn thuần là thay đổi khả năng hiển thị của một thành viên sẽ không thay đổi ý nghĩa của mã đã tồn tại ở nơi khác.
Nếu không, giả sử lớp C của bạn nằm trong tiêu đề ở đâu đó. Nếu bạn có một thành viên riêng (int), mã bạn trình bày sẽ gọi C (float). Nếu vì một lý do nào đó, thành viên C (int) đã được công khai, mã cũ sẽ đột nhiên gọi thành viên đó, mặc dù cả mã cũ cũng như chức năng được gọi là đã thay đổi.
EDIT: Các lý do khác:
Thậm chí tệ hơn, giả sử bạn có 2 chức năng sau:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
Hai chức năng có thể gọi chức năng khác nhau tùy thuộc vào việc một trong hai foo hoặc thanh được tuyên bố như một người bạn của C, hoặc A hoặc B thừa kế từ nó. Có giống hệt nhau mã gọi các chức năng khác nhau là đáng sợ.
(Đó có lẽ không phải cũng đặt như thảo luận Scott Meyer, nhưng đó là ý tưởng.)
Nguồn
2009-03-13 20:18:38
Hmm, đây dường như là một lời giải thích tuyệt vời lúc đầu. Nhưng ... nó vẫn có thể tạo lớp _without_ một int-ctor, sau đó sau đó _add_ rằng ctor quá cũ mã đột nhiên bắt đầu gọi thành viên mới ... Vì vậy, bảo vệ này chỉ tạo ra một cảm giác an toàn giả. –
Điểm tốt. Tôi sẽ thêm nhiều hơn nữa. –