Ruff_Ryders_R schrieb:
Schreibt er durch das Include nur den Inhalt vom Header an die stelle, an der das include steht, oder auch die Definitionen der Methoden?
Das #include sorgt nur dafür, dass der Inhalt der Header-Datei an der jeweiligen Stelle erscheint (wie gesagt, kann man sehr gut mit Copy'n'Paste vergleichen). Die Definitionen muss der Preprozessor nicht einfügen, denn das interessiert erst den Linker.
Ich führe das hier mal ein wenig aus. Den Compile-Prozess muss man nämlich verstehen, um sinnvoll mit C++ arbeiten zu können.
Das Compilen erfolgt in zwei (drei) Schritten:
1) Als allererstes läuft natürlich der Preprocessor und arbeitet alle #includes, #defines etc. ab. Dann wird
eine .cpp-Datei zu einer Objekt-Datei kompiliert. Der Compiler nimmt also alle Funktionsdefinitionen der jewiligen .cpp-Datei und kompiliert sie. Falls jetzt ein Funktionsaufruf in der Datei steht, der in einer anderen .cpp-Datei definiert ist, dann interessiert den Compiler diese Funktionsdefinition nicht. Er muss nur die Signatur der Funktion wissen, um sie aufrufen zu können. Dazu reicht die Funktionsdeklaration und das ist der Grund, warum du die jeweiligen Header-Dateien einbinden musst.
2) Den zweiten Schritt bezeichnen man als Linken. Der Linker nimmt alle Objekt-Dateien und bastelt sie in eine ausführbare Datei (Die .exe-Datei die unter Windows am Ende entsteht). Der Linker sorgt am Ende dafür, dass der Funktionsaufruf auch die richtige Funktion aufruft.
Wie du also siehst, braucht der Compiler erstmal nur die Klassendeklaration. Wo die Funktionen letztendlich definiert sind ist egal, solange sie in einer der Objektdateien, die der Linker erhält drin steckt.
Ruff_Ryders_R schrieb:
Woher weiß der Compiler, welche Klasse zur Headerdatei gehört bzw. welche Methode gemeint ist. Es könnten ja 2 Klassen in einer Headerdatei stehen, welche beide eine Methode int berechnenZahl() beinhalten. Oder weiß es das erst durch den Aufruf von Klassenname:
bjekt?
Da greift wieder das Prinzip des "Scopes". Auf deutsch auch "Sichtbarkeitsbereich". Wenn du in beiden Klassen eine funktion "berechnenZahl" hast, dann existiert die Funktion nur in dem jeweiligen Scope. Die Funktionen Klasse1::berechnenZahl und Klasse2::berechnenZahl sind also zwei völlig verschiedene Funktionen, deshalb hat der Compiler da kein Problem das zu unterscheiden.
Ruff_Ryders_R schrieb:
Und wie funktioniert das nun mit dem Objekt erstellen in C++, in JAVA funktionierte das ganze mit
Taschenrechner rechner = new Taschenrechner();
in C++ scheint ja auch irgendwie Taschenrechner rechner(); zu funktionieren. Könntet Ihr mir da vielleicht eine kurze Auflistung der Variationen/Möglichkeiten geben, wie man überlicherweise ein Objekt seiner eigenen Klasse erstellen kann?
In der Tat funktionieren beide Methoden. Der Unterschied ist hier der jeweilige Speicherbereich. Im Gegensatz zu Java musst du dich bei C++ selbst darum kümmern, den "richtigen" Speicher zu verwenden.
Es gibt zwei verschiedene Arten: Den Stack (statisch) und den Heap (dynamisch). Variablen auf dem Stack legst du über "int a;" oder "Taschenrechner rechner;" an. Der Nachteil ist, dass dieser Speicher freigegeben wird, sobald du die Funktion verlässt (genauer: Den Scope).
Speicher auf dem Heap dagegen musst der Programierer selbst freigeben, d.h. er wird nicht automatisch gelöscht. Speicher auf dem Heap legt man mit "Taschenrechner *rechner = new Taschenrechner()" an. Beachte den "*" vor rechner. Die Variable "rechner" ist in diesem Fall ein Zeiger auf ein Taschenrechner-Objekt (Dein Beispiel ohne Stern funktioniert nicht). Speicher auf dem Heap musst du mit delete bzw. delete[] freigeben.
Interessante Links: