seltsames mit Objekten bei Initialisierung
-
immer noch komisch!
wenn ich in klammern eine zahl reinschreibe dann gehts aber ohne zahl in klammer - gehts nicht. aber klammern weglasse geht es wiederrum. warum? ich hab doch bei definition: "int test = 0" reingeschrieben
ist Artikel erstes(); nochmal was anderes als
Artikel erstes(4); ?
-
Artikel erstes(); <- funktionsdeklaration
Artikel erstes; <- variablendeklaration
Artikel erstes(zahl); <- variablendeklaration und definition mit initialisierung
-
Lies noch mal die Antwort von Cpt.Tanga!
Mit leeren Klammern definierst Du eine Funktion namens erstes ohne Parameter, die ein Objekt vom Typ Artikel zurückgibt, und kein Objekt namens erstes. Das ist kein Bug, sondern Standard-C++.
-
achsooo ok sorry sorry. jetzt verstehe ich. funktionsdeklaration ist ja was ganz anderes! also sowas wie "int erstes();". eigentlich müsste es prototyp heissen oder?
-
Artikel erstes(int i);
Artikel erstes(int i = 0);und die hier beiden sind wiederrum eine funktionsdeklaration (prototypen) mit argumenten?
also ganz anders als
Artikel erstes(zahl);
?boah hier kann man was verwirren!
-
Korrekt. Beides

Artikel erstes(int zahl); Artikel erstes();sind für den Compiler eben Funktionsprototypen. Im ersten Fall leicht erkennbar, da in den Klammern zuerst ein Typ (int) steht. Bei zweiterem ists von der Interpretation des Standards abhängig, und der interpretiert das halt als leere Parameterliste.
Artikel erstes(zahl);ist eine Objektinstanzierung, da zahl ja kein Typ ist. Bei der Instanzierung von temporären Objekten siehts wieder anders aus.
return Artikel; // falsch, einen Typ kann man nicht zurückgeben return Artikel(); // ein default-konstruiertes Objekt schonAbstrakt gesagt:
Typ objekt1(Typ); // Funktion mit 1 Parameter Typ objekt1(Typ objekt2); // Funktion mit 1 Parameter Typ objekt1(Typ objekt2 = defwert) // Funktion mit 1 Parameter Typ objekt1(); // Funktion mit 0 Parametern Typ objekt1; // Default-Instanzierung Typ objekt1(objekt2); // Instanzierung durch Konstruktor mit 1 Parameter Typ objekt1(12); // dito return Typ(); // freistehende Temporary-Instanzierung durch Default-Konstruktor return Typ(objekt2); // freistehende Temporary-Instanzierung durch Konstruktor mit 1 Parameter
-
schön geschrieben ^^

wäre nicht auch das mal einen eintrag in die faq wert? kommt auch ziemlich häufig vor diese frage
-
ja ist gut geschrieben. verständlich.
muss ich also auch hier aufpassen? sieht aus wie eine funktion aber anders? aha!
return Artikel; // falsch, einen Typ kann man nicht zurückgeben return Artikel(); // ein default-konstruiertes Objekt schonwas ist wenn ich 2 Konstruktoren habe? das eine default, das andere nicht, also mit Parametern, die kann man nicht returnen?
wobei die frage ist für mich momentan weniger wichtig. nur würd ich alles aufschreiben was ich aufpassen muss
ansonsten vielen dank, habe jetzt mehr überblick
-
Wenn du einen Konstruktor mit Parameter hast übergibst du diesen einfach das was er erwartet:
int artikelnummer=1; return Artikel(artikelnummer);Greetz
//Edit: Deutsch überarbeitet.
-
Habs in der Liste mal ergänzt
