Hallo zusammen,
eine Frage zur Initialisierung von Objekten in C++. Wann muss man
geschweifte Klammern {} einsetzen und wann runde ()?
Ich habe verschiedene Schreibweisen in verschiedenen Quellcodes gesehen
aber werde nicht so recht schlau draus.
bambam schrieb:> Wann muss man> geschweifte Klammern {} einsetzen und wann runde ()?
Wenn man solche Fragen noch hat, sollte man sich eher einführende
Literatur zu C/C++ besorgen.
Das kann man in einem Forenpost nicht ernsthaft beantworten.
Daher ist der Tipp mit Google oder Amazon schon mal gar nicht so weit
daneben...
Jim M. schrieb:> Wenn man solche Fragen noch hat, sollte man sich eher einführende> Literatur zu C/C++ besorgen.
Genau deswegen kauf ich mir gleich ein Buch
Jim M. schrieb:> Das kann man in einem Forenpost nicht ernsthaft beantworten.
Wenn du es nicht weist wieso antwortest du dann überhaupt auf meine
Frage?
Eine kompetente Antwort kommt sicher noch.
bambam schrieb:> Jim M. schrieb:>> Wenn man solche Fragen noch hat, sollte man sich eher einführende>> Literatur zu C/C++ besorgen.>> Genau deswegen kauf ich mir gleich ein Buch
Sehr gut. Dann kannst du es ja dort nachlesen.
> Eine kompetente Antwort kommt sicher noch.
Die steht dann in deinem Buch. Warum willst du hier unbedingt jemandem
die Mühe machen, das alles nochmal zu erklären?
Rolf M. schrieb:> bambam schrieb:>> Jim M. schrieb:>>> Wenn man solche Fragen noch hat, sollte man sich eher einführende>>> Literatur zu C/C++ besorgen.>>>> Genau deswegen kauf ich mir gleich ein Buch>> Sehr gut. Dann kannst du es ja dort nachlesen.>>> Eine kompetente Antwort kommt sicher noch.>> Die steht dann in deinem Buch. Warum willst du hier unbedingt jemandem> die Mühe machen, das alles nochmal zu erklären?
Lass die Trolle labern...
In C und C++ grenzen die geschweifte Klammern eine Funktion ein z.B. If,
while, for, switch usw werden mit {} abgeschossen.
Die runden Klammern brauchst Du z.B. wenn du Werte in einer Funktion
übergeben willst oder aber auch zum rechnen.
Gruß
Daniel
Niemand weiß genau, wann welche Klammern eingesetzt werden müssen.
Normalerweise verwendet man am Anfang nur {} und ersetzt sie dann
schrittweise mit (), bis sich das Programm kompilieren lässt.
Daniel V. schrieb:> Lass die Trolle labern
Genau. Die geschweiften Klammern nach denen der TO fragt sind nämlich
die, mit denen Arrays oder Strukturen initialisiert werden.
Rund sind die beim initialisieren nur, wenn explizit oder implizit eine
Funktion dafür aufgerufen wird, z.b. der Konstruktor
Achim S. schrieb:> Daniel V. schrieb:>> Lass die Trolle labern>> Genau. Die geschweiften Klammern nach denen der TO fragt sind nämlich> die, mit denen Arrays oder Strukturen initialisiert werden.>> Rund sind die beim initialisieren nur, wenn explizit oder implizit eine> Funktion dafür aufgerufen wird, z.b. der *Konstruktor*
Nein!
Schau in der Doku nach:
https://en.cppreference.com/w/cpp/language/value_initialization
> Genau. Die geschweiften Klammern nach denen der TO fragt sind nämlich> die, mit denen Arrays oder Strukturen initialisiert werden.> Rund sind die beim initialisieren nur, wenn explizit oder implizit eine> Funktion dafür aufgerufen wird, z.b. der Konstruktor
Das ist für C++ definitiv falsch.
Wilhelm M. schrieb:> Schau mal bei "uniform initialization syntax" nach
Ich wollte dir mal dafür danken, dass du als erster die Frage gelesen,
darüber nachgedacht und ein Stichwort genannt hast, nach dem sich auch
vernünftig suchen lässt. So trivial wie alle tun, ist die Antwort
nämlich gar nicht.
nocheinGast schrieb:> Wilhelm M. schrieb:>> Schau mal bei "uniform initialization syntax" nach>> Ich wollte dir mal dafür danken, dass du als erster die Frage gelesen,> darüber nachgedacht und ein Stichwort genannt hast, nach dem sich auch> vernünftig suchen lässt. So trivial wie alle tun, ist die Antwort> nämlich gar nicht.
Schön, wenn ich Dir helfen konnte.
Tipp: solche Fragen stellt man am besten bei stackoverflow statt hier
;-)
nocheinGast schrieb:> Ich wollte dir mal dafür danken, dass du als erster die Frage gelesen,> darüber nachgedacht und ein Stichwort genannt hast, nach dem sich auch> vernünftig suchen lässt. So trivial wie alle tun, ist die Antwort> nämlich gar nicht.
Keiner hat hier so getan, als sei es trivial. Ganz im Gegenteil! Gerade
deshalb wurde ja angeraten, es besser in einem Buch nachzulesen.
An den Kommentaren von einigen Vorgänger (Trolle ausgenommen), merkt
man, dass diese die Neuerungen in den C++ Standards noch nicht
mitbekommen haben. Das soll auch gar kein Vorwurf sein, weil man je nach
Buch oder sonstiger Quelle gar nicht drauf kommt.
Schau dir sonst mal diesen Vortrag:
https://www.youtube.com/watch?v=7DTlWPgX6zs
Josuttis stellt sich auch die Frage, was man jetzt verwenden soll, was
aber gar nicht so leicht zu entscheiden ist.
M.K. B. schrieb:
Den Link wollte ich auch grad raussuchen. Der Vortrag hat mich doch ein
wenig geschockt. Immerhin gibt er zu, dass das ganze aus dem Ruder
gelaufen ist :)
bambam schrieb:> Hallo zusammen,>> eine Frage zur Initialisierung von Objekten in C++. Wann muss man> geschweifte Klammern {} einsetzen und wann runde ()?>> Ich habe verschiedene Schreibweisen in verschiedenen Quellcodes gesehen> aber werde nicht so recht schlau draus.
Fang mit Python an, dann musst du dir darüber erst einmal keine Gedanken
machen.
Rolf M. schrieb:> Die steht dann in deinem Buch. Warum willst du hier unbedingt jemandem> die Mühe machen, das alles nochmal zu erklären?
Mal ehrlich, kauft sich einer im Jahr 2018 noch totes Holz für sowas?
Ich hab zwar auch mit dem AmigaBasic Handbuch angefangen, aber das war
im letzten Jahrhundert und da war Internet noch in weiter Ferne.
Bei einem Bekannten stehen eine Menge C, C++, JS, Ruby... Bücher im
Regal - und verstauben. Weil man Infos einfach schneller im Internet
findet.
M.K. B. schrieb:> An den Kommentaren von einigen Vorgänger (Trolle ausgenommen), merkt> man, dass diese die Neuerungen in den C++ Standards noch nicht> mitbekommen haben. Das soll auch gar kein Vorwurf sein, weil man je nach> Buch oder sonstiger Quelle gar nicht drauf kommt.>> Schau dir sonst mal diesen Vortrag:> https://www.youtube.com/watch?v=7DTlWPgX6zs>> Josuttis stellt sich auch die Frage, was man jetzt verwenden soll, was> aber gar nicht so leicht zu entscheiden ist.
Das eigentliche Problem ist, daß Neuerungen wegen der sehr
verständlichen Regeln "Never break existing code" nie ihre Vorgänger
vollständig ersetzen. Das Alte bleibt und kann jederzeit als Argument
gegen die Sprache verwendet werden.
Bei vielen anderen Sprachen kann man auch Leichen ausgraben, wenn man
will, nur macht man das bei erfolgreichen natürlich lieber.
Wilhelm M. schrieb:> Schön, wenn ich Dir helfen konnte.>> Tipp: solche Fragen stellt man am besten bei stackoverflow statt hier> ;-)
Ich bin nicht der TO, ich war nur ziemlich genervt von den Posts
zwischen der Frage und deiner Antwort :).
Karl K. schrieb:> Mal ehrlich, kauft sich einer im Jahr 2018 noch totes Holz für sowas?
Wer hat hier was von kaufen erzählt? Bibliotheken sollten immer noch
existieren - und da kann man IMHO auch einführende Literatur zu C/C++
finden.
Karl K. schrieb:> Weil man Infos einfach schneller im Internet> findet.
Weil man sich an die Stichworte aus den Büchern erinnert.
Es soll auch noch Menschen geben die längere Texte lieber auf Totholz
als am Bildschirm lesen.
Hi bambam,
auf eine Sache würde ich dich gern hinweisen.
Die diversen Dokumente über {} vs () weisen manchmal darauf hin, dass
wenn Du {} benutzt ein Problem entstehen kann, wenn es einen Constructor
gibt, der std::initializer_list nimmt. Dann führen () und {} zu
unterschiedlichem Verhalten.
Das ist zum Beispiel bei std::vector der Fall.
std::vector<int>(1000, 42) macht einen Vektor mit 1000 Elementen vom
Wert 42, std::vector<int>{1000, 42} macht einen Vektor mit den
angegebenen 2 Elementen.
vlg
Timm
Daniel V. schrieb:> In C und C++ grenzen die geschweifte Klammern eine Funktion ein z.B. If,> while, for, switch usw werden mit {} abgeschossen.
Stimmt so nicht. Das geht auch ohne {}, wenn nur eine Anweisung folgt.
Mit {} gilt das if,else, while for ... für den ganze Block von
Anweisungen zwischen den Klammern.
Runde Klammern umgeben die Bedingungen bei if,while usw sowie die
Parameter eines Funktionsaufrufes. Außerdem sind sie paarweise optional
einsetzbar, um den Code übersichtlicher zu machen.
Rolf M. schrieb:> if (argc > 1)> (> x = 5,> y = 3,> hello(x, y)> );
Das ist aber nur eine Anweisung, die mit nur einem ';' abgeschlossen
ist. Sie ist nur mit ',' unterteilt. Die () spielen vermutlich gar keine
Rolle, hab es aber nicht ausgetestet.
Auf jeden Fall sind {} und () nicht gegeneinander austauschbar.