Datenelemente (Eigenschaften) und Elementfunktionen (Methoden)

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();
};

Definition von Methoden

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_;
}

Beispiel Rationale Zahlen

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;
}