1// Literatur: Vorlesungsunterlagen SEN (FH Hagenberg, HSSE Semester 2)
2// C++ Referenz (http://www.cplusplus.com)
3
4// Klasse kapselt Members(Variablen), Methoden(Funktionen)
5// und regelt den Zugriff
6
7class aClass
8{
9private: // eigener Zugriff +friends
10 int mVar; // Member
11protected: // eigener Zugriff +abgeleitete Klassen +friends
12 void doSomething(){} // Methode
13public: // oeffentlicher Zugriff
14 aClass(){} // Constructor: Initialisierung des Objektes
15 ~aClass(){} // Destruktor: Freigabe der Resourcen
16};
17
18
19// Erzeugen von Instanzen (Objekten)
20// statisch - am Stack
21 aClass cl1;
22 cl1.setX(0);
23
24// dynamisch - am Heap
25 aClass *pCl2 = 0;
26 pCl2 = new aClass;
27 pCl2->setX(0);
28
29 delete pCl2;
30 pCl2 = 0;
31
32
33// this-Pointer
34// versteckter/impliziter Parameter bei jeder Methode
35 void doSomething()
36 {
37 this->setX(0);
38 }
39
40 aClass * const this; // so waere der this-Pointer deklariert
41
42
43// Konstante Methoden
44// Methode kann Members nicht veraendern
45 int doSomething() const
46 {
47 return mX;
48 }
49
50
51// Konstruktor Initialisierungsliste
52// Konstanten muessen initialisiert werden
53// explicit ... erlaubt keine implicite Konvertierung
54 class aClass
55 {
56 public:
57 aClass(): mConst(10), mVal(0) {}
58 explicit aClass(int value): mConst(10), mVal(value) {}
59 private:
60 int const mConst;
61 int mVal;
62 };
63
64 aClass cl = 100; // nicht erlaubt da implizite Konvertierung
65 // von int nach aClass nicht erlaubt
66
67
68// Copy-Konstruktor
69 class aClass
70 {
71 aClass(aClass const &cl): mVal(cl.mVal), ... {}
72 };
73
74 aClass cl1; // default CTOR
75 aClass cl2 = cl1; // Copy-CTOR
76 aClass cl3(cl1); // Copy-CTOR
77
78 aClass cl4;
79 cl4 = cl1; // Zuweisungsoperator =
80
81
82// friend-Funktion und Klassen
83 class aClass
84 {
85 friend void Function(aClass const &cl);
86 friend class bClass;
87 ...
88 };
89
90 void Function(aClass const &cl)
91 {
92 cl.getX();
93 ...
94 }
95
96
97// statische Member und Methoden
98// statische Member existieren 1x pro Klasse, nicht 1x pro Objekt
99 class aClass
100 {
101 ...
102 static int GetCnt() const
103 {
104 return cnt;
105 }
106
107 static int cnt;
108 };
109 int aClass::cnt = 0; // static-Member initialisieren
110
111 int count = Object::GetCnt(); // Aufruf statischer Methoden
112
113
114// Beziehungen zwischen Klassen
115 class aClass: public bClass // "ist ein"-Beziehung (Spezialisierung)
116 {
117 ...
118 cClass *mCCl; // "hat"-Beziehung (Aggregation)
119 };
120
121
122// Polymorphie
123// erforder einen Pointer oder eine Referenz
124 baseClass *pBase = new derivedClass1;
125 pBase = new derivedClass2;
126
127
128// Ueberladen
129// Unterscheidung am Rueckgabetyp alleine genuegt nicht
130 class aClass
131 {
132 ...
133 void doSomething(int val1, int val2);
134 void doSomething(int val1, double val2);
135 void doSomething(int val1, int val2, int val3);
136 };
137
138
139// statischer und dynamischer Datentyp
140 baseClass *pBase = new derivedClass;
141 // statischer Datentyp = baseClass
142 // dynamischer Datentyp = derivedClass
143
144 // Aufruf jener Funktion, welcher dem dynamischen Datentyp entspricht
145 virtual void doSomethingMethod()
146 // DTOR immer virtuell, damit Objekte zur Gaenze geloescht werden
147 virtual ~aClass()
148 // diese Methode muss in der abgeleiteten Klasse implementiert werden,
149 // somit ist Klasse abstrakt
150 virtual void doSomethingMethod() = 0;
151
152
153// Aufteilung in Header- und Source-Datei
154// *.h
155 #ifndef ACLASS_H
156 #define ACLASS_H
157
158 class aClass
159 {
160 public:
161 aClass();
162 ~aClass();
163
164 void doSomething();
165 private:
166 int mVal;
167 };
168
169// *.cpp
170 #include "aclass.h"
171
172 aClass::aClass()
173 {
174 ...
175 }
176 aClass::~aClass()
177 {
178 ...
179 }
180 void aClass::doSomething()
181 {
182 ...
183 }
184
185
186// Template Klasse
187// selbst die Implementierung muss in der Header-Datei erfolgen
188 template <typename T>
189 class Value
190 {
191 public:
192 Value(T const &val);
193 void Print() const;
194 private:
195 T value;
196 };
197
198 template <typename T>
199 Value<T>::Value(T const &val)
200 {
201 value = val;
202 }
203 template <typename T>
204 void Value<T>::Print() const
205 {
206 cout << value;
207 }
208
209 Value<int> val1(4);
210 val1.Print();
211
212 Value<double> val2(5.5);
213 val2.Print();
214
215
216// Operator Overloading
217 class aClass
218 {
219 ...
220 aClass operator +(aClass const &cl);
221 bool operator ==(aClass const &cl);
222 };
223 ostream &operator <<(ostream &out, aClass const &cl);
224
225
226// Vorwaertsdeklaration
227 class aClass;
228
229 class bClass
230 {
231 ...
232 private:
233 aClass mCl;
234 };
235
236 class aClass
237 {
238 ...
239 private:
240 bClass mCl;
241 };