Zamierzam dodać do istniejących odpowiedzi, ponieważ nowoczesny C ++ jest teraz czymś, a oficjalne podstawowe wytyczne zostały stworzone, aby pomóc w takich pytaniach.
Oto odpowiednia sekcja z wytycznych:
C.2: Użyj klasy, jeśli klasa ma niezmiennik; użyj struct, jeśli członkowie danych mogą się zmieniać niezależnie
Niezmiennik jest logicznym warunkiem dla elementów członkowskich obiektu, który konstruktor musi ustalić, aby mogły przyjąć publiczne funkcje składowe. Po ustaleniu niezmiennika (zwykle przez konstruktora) można wywołać każdą funkcję składową dla obiektu. Niezmiennik można podać nieformalnie (np. W komentarzu) lub bardziej formalnie za pomocą Oczekiwania.
Jeśli wszyscy członkowie danych mogą się zmieniać niezależnie od siebie, niezmienność nie jest możliwa.
Jeśli klasa ma jakieś prywatne dane, użytkownik nie może całkowicie zainicjować obiektu bez użycia konstruktora. W związku z tym osoba definiująca klasę zapewni konstruktor i musi określić jego znaczenie. W praktyce oznacza to potrzebę zdefiniowania niezmiennika.
Egzekwowanie
Poszukaj struktur ze wszystkimi danymi prywatnymi i klas z publicznymi członkami.
Podane przykłady kodu:
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
e działają dobrze w przypadku członków, którzy są na przykład pochodzący od siebie nawzajem lub ze sobą powiązani. Mogą również pomóc w sprawdzaniu poprawności podczas tworzenia instancji. Struct
dobrze sprawdzają się w przypadku posiadania „worków danych”, w których tak naprawdę nic specjalnego się nie dzieje, ale logicznie rzecz biorąc, grupy członków mają sens.
Z tego wynika, że class
istnieją es do obsługi hermetyzacji i innych pokrewnych koncepcji kodowania, do których struct
po prostu nie są zbyt przydatne.