IMHO, các câu trả lời hiện có làm một công việc kém giải thích "Tại sao" của điều này - tập trung quá nhiều vào việc nhắc lại giá trị của hành vi nào. "các công cụ sửa đổi truy cập hoạt động ở cấp độ lớp chứ không phải ở cấp độ đối tượng." - có, nhưng tại sao?
Khái niệm bao quát ở đây là (các) lập trình viên thiết kế, viết và duy trì một lớp được (được) mong đợi hiểu cách đóng gói OO mong muốn và được trao quyền để điều phối việc thực hiện nó. Vì vậy, nếu bạn đang viết class X
, bạn không chỉ mã hóa cách một X x
đối tượng riêng lẻ có thể được sử dụng bởi mã có quyền truy cập vào nó, mà còn cả cách:
- các lớp dẫn xuất có thể tương tác với nó (thông qua các chức năng ảo thuần túy tùy chọn và / hoặc quyền truy cập được bảo vệ), và
X
các đối tượng khác biệt hợp tác để đưa ra các hành vi dự kiến đồng thời tôn trọng các điều kiện hậu và bất biến từ thiết kế của bạn.
Nó không chỉ là hàm tạo bản sao - rất nhiều hoạt động có thể liên quan đến hai hoặc nhiều trường hợp của lớp của bạn: nếu bạn đang so sánh, thêm / nhân / chia, sao chép-xây dựng, sao chép, gán, v.v. thì bạn thường gặp hoặc đơn giản là phải có quyền truy cập vào dữ liệu riêng tư và / hoặc được bảo vệ trong đối tượng kia, hoặc muốn nó cho phép triển khai chức năng đơn giản hơn, nhanh hơn hoặc nói chung là tốt hơn.
Cụ thể, các hoạt động này có thể muốn tận dụng quyền truy cập riêng tư để thực hiện những việc như:
- (các trình tạo bản sao) sử dụng một thành viên riêng của đối tượng "rhs" (bên tay phải) trong danh sách trình khởi tạo, để một biến thành viên chính nó được tạo bản sao thay vì được xây dựng mặc định (nếu thậm chí là hợp pháp) sau đó cũng được gán (một lần nữa, nếu hợp pháp)
- chia sẻ tài nguyên - xử lý tệp, phân đoạn bộ nhớ được chia sẻ,
shared_ptr
dữ liệu tham chiếu, v.v.
- có quyền sở hữu vật, ví dụ:
auto_ptr<>
"chuyển" quyền sở hữu sang vật thể đang xây dựng
- sao chép các thành viên "bộ nhớ cache", hiệu chuẩn hoặc trạng thái riêng tư cần thiết để xây dựng đối tượng mới ở trạng thái có thể sử dụng tối ưu mà không cần phải tạo lại chúng từ đầu
- sao chép / truy cập thông tin chẩn đoán / theo dõi được lưu giữ trong đối tượng đang được sao chép mà không thể truy cập được thông qua các API công khai nhưng có thể được sử dụng bởi một số đối tượng ngoại lệ sau này hoặc ghi nhật ký (ví dụ: một số thông tin về thời gian / hoàn cảnh khi phiên bản không được tạo "nguyên bản" được xây dựng)
- thực hiện sao chép một số dữ liệu hiệu quả hơn: ví dụ như các đối tượng có thể có một
unordered_map
thành viên nhưng chỉ hiển thị công khai begin()
và end()
trình vòng lặp - với quyền truy cập trực tiếp vào size()
bạn có thể reserve
sao chép nhanh hơn; tệ hơn nữa nếu họ chỉ để lộ at()
và insert()
và nếu không throw
...
- sao chép các tham chiếu trở lại đối tượng mẹ / điều phối / quản lý có thể không xác định hoặc chỉ ghi cho mã khách hàng