Tôi sẽ thêm vào các câu trả lời hiện có bởi vì C ++ hiện đại giờ đã trở thành một thứ và các Nguyên tắc cốt lõi chính thức đã được tạo ra để trợ giúp các câu hỏi như thế này.
Đây là một phần có liên quan từ các nguyên tắc:
C.2: Sử dụng lớp nếu lớp có một bất biến; sử dụng struct nếu các thành viên dữ liệu có thể khác nhau một cách độc lập
Một bất biến là một điều kiện logic cho các thành viên của một đối tượng mà một phương thức khởi tạo phải thiết lập để các chức năng thành viên chung đảm nhận. Sau khi bất biến được thiết lập (thường là bởi một phương thức khởi tạo), mọi hàm thành viên đều có thể được gọi cho đối tượng. Một bất biến có thể được nêu một cách không chính thức (ví dụ: trong một bình luận) hoặc chính thức hơn bằng cách sử dụng Kỳ vọng.
Nếu tất cả các thành viên dữ liệu có thể thay đổi độc lập với nhau, thì không thể bất biến.
Nếu một lớp có bất kỳ dữ liệu riêng tư nào, người dùng không thể khởi tạo hoàn toàn một đối tượng mà không sử dụng hàm tạo. Do đó, trình định nghĩa lớp sẽ cung cấp một phương thức khởi tạo và phải chỉ rõ ý nghĩa của nó. Điều này có nghĩa là trình định nghĩa cần xác định một bất biến.
Thực thi
Tìm kiếm cấu trúc với tất cả dữ liệu riêng tư và các lớp có thành viên công khai.
Các ví dụ mã được đưa ra:
struct Pair { // the members can vary independently
string name;
int volume;
};
// but
class Date {
public:
// validate that {yy, mm, dd} is a valid date and initialize
Date(int yy, Month mm, char dd);
// ...
private:
int y;
Month m;
char d; // day
};
Class
chúng hoạt động tốt cho các thành viên, ví dụ, có nguồn gốc từ nhau hoặc có liên quan với nhau. Họ cũng có thể giúp kiểm tra sự tỉnh táo khi bắt đầu. Struct
s hoạt động tốt vì có "túi dữ liệu", nơi không có gì đặc biệt thực sự đang diễn ra nhưng các thành viên sẽ hợp lý khi được nhóm lại với nhau.
Từ đó, có thể hiểu rằng các class
es tồn tại để hỗ trợ việc đóng gói và các khái niệm mã hóa liên quan khác, những khái niệm đó struct
đơn giản là không hữu ích cho lắm.