Sorry, aber ich verstehe dein Beispiel geradfe nicht
Ich hab hier nochmal den gleichen Quelltext aber als ganzes und nicht als Auschnitt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
// C++ für Spieleprogrammierer
// Listing 11.7
// Der Kopierkonstruktor
//
#include <iostream>
using namespace std;
// Klassen
//
// Klasse für ein Raumschiff
//
class CRaumschiff
{
public:
CRaumschiff ();
~CRaumschiff ();
CRaumschiff (const CRaumschiff &rhs);
void ZeigeWerte ();
private:
int *m_pGeschwindigkeit;
};
// Konstruktor
//
CRaumschiff::CRaumschiff ()
{
cout << "Konstruktor wurde aufgerufen.\n";
// Speicher reservieren
//
m_pGeschwindigkeit = new int;
* m_pGeschwindigkeit = 1541;
} // Konstruktor
// Destruktor
//
CRaumschiff::~CRaumschiff ()
{
cout << "Destruktor wurde aufgerufen.\n";
// Wenn pGeschwindigkeit ein gültiger Zeiger ist,
// Speicher wieder freigeben.
//
if (m_pGeschwindigkeit != NULL)
{
delete (m_pGeschwindigkeit);
m_pGeschwindigkeit = NULL;
}
} // Destruktor
// Kopierkonstruktor
CRaumschiff::CRaumschiff (const CRaumschiff &rhs)
{
cout << "Kopierkonstruktor wurde aufgerufen.";
cout << endl;
// Tiefe Kopie
m_pGeschwindigkeit = new int;
*m_pGeschwindigkeit = *(rhs.m_pGeschwindigkeit);
} // Kopierkonstruktor
// ZeigeWerte
//
void CRaumschiff::ZeigeWerte ()
{
// Wenn der Zeiger gültig ist, Geschwindigkeit anzeigen
//
if (m_pGeschwindigkeit != NULL)
{
cout << "Geschwindigkeit: " << * m_pGeschwindigkeit;
cout << endl;
}
} // ZeigeWerte
// Eine beliebige Funktion, die eine Instanz
// der Klasse CRaumschiff übernimmt
void Funktion (CRaumschiff Schiff)
{
Schiff.ZeigeWerte ();
} // Funktion
// Hauptprogramm
//
int main ()
{
// Ein neues Raumschiff erzeugen
CRaumschiff Jaeger;
// Geschwindigkeit des Raumschiffs anzeigen lassen
Jaeger.ZeigeWerte ();
// Die Instanz an eine Funktion übergeben
Funktion (Jaeger);
return (0);
}
|
Anstatt CJaeger heißt ddie Klasse jetzt CRaumschiff
Ich gehe jetzt mal den Quelltext so durch wie ich ihn verstehe...
In der main Funktion wird eine Instanz dert Klasse CRaumschiff erstellt und für den Zeiger *p_mGeschwindigkeit Speicher für einen int-Wert reserviert. Anschließend wird der Speicher mit dem Wert 1514 "gefüllt".
Als nächstes wird einfach die Memberfunktion "Zeige Werte" der Raumschiff-Klasse aufgerufen um die Geschwindigkeit auf dem Bildschirm auszugeben...
Dann wird die Funktion "Funktion" aufgerufen die die Jaeger-Instanz übernimmt und in der Funktion wieder die "Zeige Werte" Memberfunktion ausführt.
Wenn jetzt die Funktion "Funktion" ausgeführt wird, wird ja automatisch der Kopierkonstruktor ausgeführt, welcher eine Konstante Referenz der Raumschiffklasse (in diesem Fall rhs) übernimmt. Und ab hier stehe ich irgendwie im Dunkeln... Ich glaube zwar dass, das passiert aber bin mir nicht ganz sicher: Für den Zeiger p_mGeschwindigkeit wird nochmals neuer Speicher reserviert. Dann wird dem Speicher der Wert zugewiesen der im Speicher der Zeigers rhs.m_pGeschwindigkeit steht (sry wenn ich das jetzt falsch ausdrücke aber ich bin mir grade nicht ganz so sicher wie ich das sagen soll). Allerdings haben wir der Membervariablen von der Instzanz rhs nie einen Wert zugewiesen wesshalb der Wert irgendeiner sein könnte oder
...
Ich hoffe ihr versteht das aber ich weiß Momentan einfach nicht wie ich es anders ausdrücken soll
bennichamp