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.
Beitrag #5624722 wurde von einem Moderator gelöscht.
Beitrag #5624725 wurde von einem Moderator gelöscht.
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: > Wann muss man > geschweifte Klammern {} einsetzen und wann runde ()? Geschweifte und runde Klammern setzt man ein, wenn man nicht keine Klammern einsetzt will, wie es hier gemacht wird: https://github.com/openatv/enigma2/blob/6.2/lib/dvb/amldecoder.cpp#L67 :D
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.
Schau mal bei "uniform initialization syntax" nach bzw: hier: https://en.cppreference.com/w/cpp/language/value_initialization
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
Die C++ Core Guidelines (Sammlung von Richtlinien zum C++ programmieren) empfehlen immer {} zu nutzen: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-list
> 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
Ich persönlich benutz überall wos geht {}, selbst wenn ich ein int initialisier.
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.
Man kann so einen Block auch mit runden Klammern machen:
1 | #include <stdio.h> |
2 | |
3 | void hello(int a, int b) |
4 | {
|
5 | printf("Hello, numbers are %d and %d\n", a, b); |
6 | }
|
7 | |
8 | int main(int argc, char* argv[]) |
9 | {
|
10 | int x, y; |
11 | if (argc > 1) |
12 | (
|
13 | x = 5, |
14 | y = 3, |
15 | hello(x, y) |
16 | );
|
17 | }
|
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.
:
Bearbeitet durch User
{} klammern einen block begin..end () klammern einen ausdruck for () allerdings gibt es noch ein paar feinheiten ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.