In der Programmiersprache C können mit struct nur Datenelemente zusammengefasst werden. Eine Funktion, die zu einer Klasse gehört, wird als Elementfunktion (Methode) bezeichnet.
Beispiel 1a: Die Klasse C2DPunkt soll einen zweidimensionalen Punkt darstellen. Sie fasst dessen Koordinaten x und y (Datenelemente) sowie die Funktionen Init, toStr und show zusammen.
class C2DPunkt {double x,y; void Init(double x_, double y_); AnsiString toStr(); void show(); };
Eine Elementfunktion kann innerhalb oder außerhalb der Klasse definiert werden. Wenn sie außerhalb der Klasse definiert wird, gibt man vor ihrem Namen den Namen der Klasse und den Bereichsoperator „::“ an. Sie muss dann zuvor in der Klasse durch die Angabe ihres Prototyps deklariert werden.
Beispiel 1b: Nach den Deklarationen des letzten Beispiels können die Funktionen für die Klasse C2DPunkt folgendermaßen definiert werden:
void C2DPunkt::Init(double x_, double y_) {x = x_; y = y_; } AnsiString C2DPunkt::toStr() {return "("+FloatToStrF(x,ffGeneral,6,2)+"|"+FloatToStrF(y,ffGeneral,6,2)+")"; } // z.B. (2,35|3,46) void C2DPunkt::show() {Form1->Memo1->Lines->Add(toStr()); }
Wenn eine Elementfunktion nicht außerhalb, sondern innerhalb der Klasse definiert (und nicht nur deklariert) wird, ist sie automatisch eine inline-Funktion. Wie bei globalen inline-Funktionen muss der Compiler den Aufruf einer inline-Elementfunktion nicht durch ihre Anweisungen ersetzen. Ein solcher Aufruf kann auch als „gewöhnlicher“ Funktionsaufruf übersetzt werden.
Beispiel 1c: Die folgende Klassendefinition unterscheidet sich von der aus dem letzten Beispiel nur dadurch, dass die Funktionen hier inline-Funktionen sind.
class C2DPunkt {double x,y; void Init(double x_, double y_) {x = x_; y = y_; } AnsiString toStr() {return "("+FloatToStrF(x,ffGeneral,6,2)+"|"+FloatToStrF(y,ffGeneral,6,2)+")"; } // z.B. (2,35|3,46) void show() {Form1->Memo1->Lines->Add(toStr()); } };
Bemerkung: Damit eine Elementfunktion eine inline-Funktion ist, muss man sie allerdings nicht in der Klasse definieren. Man kann sie auch außerhalb der Klasse mit dem Schlüsselwort inline definieren:
inline void C2DPunkt::Init(double x_, double y_) {x = x_; y = y_; }
Eine Klasse CRZahl soll Brüche verarbeiten können.
// Klassen und Objekte // Das Programm soll eine Klasse für rationale Zahlen implementieren // J.L. #include <iostream> #include <conio.h> using namespace std; class CRZahl { // hier wird die Klasse CRZahl impementiert private: int zaehler,nenner; // Eigenschaften (Properties) public: void eingabe(int z,int n); // Methoden void ausgabe(); void kuerzen(); void erweitern(int e); }; // Implementierung der Funktionen int ggt(int a, int b) { while (a!=b) { if (a>b) a=a-b; else if (b>a) b=b-a; } return a; } // Implementierung der Methoden void CRZahl::eingabe(int z,int n) { zaehler=z; nenner =n; } void CRZahl::ausgabe() { cout<<zaehler<<"/"<<nenner<<endl; } void CRZahl::kuerzen() { int teiler=ggt(zaehler,nenner); zaehler=zaehler/teiler;nenner=nenner/teiler; } void CRZahl::erweitern(int e) { zaehler=zaehler*e; nenner=nenner*e; } // Hauptprogramm int main() { CRZahl Bruch; // Instanz der Klasse CRZahl = Objekt cout << "Rationale Zahlen\n\n"; Bruch.eingabe(917,700); Bruch.ausgabe(); Bruch.kuerzen(); Bruch.ausgabe(); Bruch.erweitern(3); Bruch.ausgabe(); // Zaehler und Nenner können nicht direkt ausgegeben werden!! // cout<<Bruch.zaehler<<"/"<<Bruch.nenner; getch(); return 0; }