struct in C und class in C++
In dieser Lektion bildest du ein Bankkonto mit struct in C und mit class in C++ ab und siehst den Unterschied zwischen beiden Ansätzen.
Einführung
In C fasst struct zusammengehörige Daten zusammen, die verarbeitenden Funktionen werden separat geschrieben. In C++ vereint class Daten und Memberfunktionen (member functions) in einem Typ und kann Daten mit private verbergen, um die Korrektheit des Objekts zu schützen.
Wichtige Punkte
- Lege fest, welche Bedingungen in der Datenstruktur immer gelten müssen (Invarianten), bevor du die Operationen schreibst.
- Behandle die Fälle leer, voll und fehlgeschlagene Speicherreservierung vollständig.
- Bewerte bei jeder Operation Komplexität und Speicherverwaltung gemeinsam.
Codebeispiele in C und C++
#include <stdio.h>
typedef struct {
const char *owner;
double balance;
} Account;
void deposit(Account *account, double amount) {
if (amount > 0) {
account->balance += amount;
}
}
int main(void) {
Account account = {"Ada", 100.0};
deposit(&account, 25.0);
printf("%s: %.2f\n", account.owner, account.balance);
return 0;
}
Ada: 125.00
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
class Account {
std::string owner_;
double balance_;
public:
Account(std::string owner, double balance)
: owner_(std::move(owner)), balance_(balance) {}
void deposit(double amount) {
if (amount > 0) {
balance_ += amount;
}
}
void print() const {
std::cout << owner_ << ": " << std::fixed
<< std::setprecision(2) << balance_ << '\n';
}
};
int main() {
Account account("Ada", 100.0);
account.deposit(25.0);
account.print();
}
Ada: 125.00
C und C++ im Vergleich
In der C-Version erhält die Funktion deposit einen Zeiger auf struct Account und bucht nur positive Beträge, doch jeder beliebige Code kann balance direkt ändern. In der C++-Version steht balance_ vor public: und ist deshalb standardmäßig private, sodass es sich nur über gültige Methoden wie deposit() ändern lässt. Dadurch ist es sehr schwer, einen falschen Zustand wie einen willkürlich gesetzten Kontostand zu erzeugen.
Daten (struct) und Operationen sind getrennt, und Speicher wird von Hand reserviert und freigegeben.
Klassen und Container schützen die Korrektheit der Daten und verwalten ihre Ressourcen selbst.
Übungen zur Vertiefung
Führe beide Versionen aus und ändere dann den Code, um zu beobachten, welche Sicherheit jede Sprache bietet.
- Ergänze Tests für den leeren Zustand und für das Erreichen der Kapazitätsgrenze.
- Schreibe die Speicherfreigabe und prüfe auf Speicherlecks.
- Vergleiche die Komplexität mit dem entsprechenden Container der Standardbibliothek.
Mit einer Challenge üben
Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.
Alle Challenges