c ++ variable Zuweisung, ist das ein normaler Weg ..?

7

Das mag eine dumme Frage sein, aber trotzdem bin ich ein bisschen neugierig ... Kürzlich habe ich an einem meiner früheren Kollegen Projekte gearbeitet, und ich habe bemerkt, dass er wirklich liebte, etwas wie dieses zu verwenden:

%Vor%

anstelle von:

%Vor%

Ist das eine normale / gute Methode in C ++? Gibt es irgendwelche Vorteile? ( Oder ist das nur ein dummer Programmierstil, in den er sich verliebt hat?? )

Das erinnert mich wirklich ein bisschen an eine gute Möglichkeit, wie Klassenmitgliedsvariablen im Klassenkonstruktor zugewiesen werden können ... etwas in der Art:

%Vor%

statt dessen:

%Vor%     
Gediminas 05.09.2012, 15:41
quelle

8 Antworten

8

Für grundlegende Typen gibt es keinen Unterschied. Verwenden Sie das, was mit dem vorhandenen Code übereinstimmt und Ihnen natürlicher erscheint.

Andernfalls

%Vor%

führt direkte Initialisierung und

aus %Vor%

führt Kopierinitialisierung durch .

Der zweite Teil ist eine Member-Initialisierer-Liste, es gibt eine Menge Q & amp; Wie es auf StackOverflow.

    
Luchian Grigore 05.09.2012, 15:46
quelle
3

Beide sind gültig. Für eingebaute Typen machen sie dasselbe; für Klassenarten gibt es einen feinen Unterschied.

%Vor%

Die offensichtliche Implikation ist, dass, wenn MyClass keinen Kopierkonstruktor hat oder einen hat, aber nicht darauf zugegriffen werden kann, die versuchte Konstruktion fehlschlägt. Wenn die Konstruktion erfolgreich wäre, kann der Compiler den Kopierkonstruktor überspringen und MyClass(int) direkt verwenden.

    
Pete Becker 05.09.2012 15:47
quelle
3

Alle obigen Antworten sind korrekt. Fügen Sie einfach hinzu, dass C ++ 11 einen anderen Weg unterstützt, einen generischen, wie sie sagen, um Variablen zu initialisieren.

%Vor%

oder

%Vor%     
Coding Mash 05.09.2012 15:49
quelle
2

Mehrere andere gute Antworten weisen auf den Unterschied zwischen dem Erstellen von "in place" ( ClassType v(<constructor args>) ) und dem Erstellen eines temporären Objekts und dem Kopieren des Konstruktors zum Kopieren ( ClassType v = <constructor arg> ) hin. Zwei zusätzliche Punkte müssen gemacht werden, denke ich. Erstens hat die zweite Form offensichtlich nur ein einziges Argument. Wenn also Ihr Konstruktor mehr als ein Argument benötigt, sollten Sie die erste Form bevorzugen (ja, es gibt Möglichkeiten, aber ich denke, dass die direkte Konstruktion prägnanter und lesbarer ist) Wie bereits erwähnt, ist das eine persönliche Vorliebe).

Zweitens kommt es darauf an, welche Form Sie verwenden, wenn Ihr Kopierkonstruktor etwas anderes tut als Ihr Standardkonstruktor. Dies wird die meiste Zeit nicht der Fall sein, und einige werden argumentieren, dass es eine schlechte Idee ist, dies zu tun, aber die Sprache erlaubt es, dass dies der Fall ist (alle Überraschungen, mit denen du am Ende behaftet bist, obwohl, bist deine eigene Schuld).

    
twalberg 05.09.2012 15:54
quelle
2

Es ist ein C ++ - Stil zum Initialisieren von Variablen - C ++ hat ihn für grundlegende Typen hinzugefügt, so dass die gleiche Form für grundlegende und benutzerdefinierte Typen verwendet werden kann. Dies kann sehr wichtig für Vorlagencode sein, der für beide Typen instanziiert werden soll.

Ob Sie es für die normale Initialisierung von fundamentalen Typen verwenden möchten, ist eine Stilpräferenz.

Beachten Sie, dass C ++ 11 außerdem die einheitliche Initialisierungssyntax hinzufügt, die denselben Stil ermöglicht Initialisierung für alle Typen - sogar Aggregate wie POD-Strukturen und -Arrays (obwohl benutzerdefinierte Typen möglicherweise einen neuen Typ von Konstruktor haben müssen, der eine Initialisierungsliste benötigt, um die einheitliche Syntax mit ihnen zu verwenden).

    
Michael Burr 05.09.2012 15:46
quelle
2

Ihre Frage ist überhaupt keine dumme Frage, da die Dinge nicht so einfach sind, wie sie scheinen mögen. Angenommen, Sie haben:

%Vor%

und

%Vor%

Schreiben

%Vor%

Erfordert, dass auf den Kopierkonstruktor von B zugegriffen werden kann. Schreiben

%Vor%

Erfordert außerdem, dass Bs Konvertierungskonstruktor B (A const & amp;) nicht explizit deklariert wird. Auf der anderen Seite, wenn Sie

schreiben %Vor%

alles ist gut, aber wenn Sie

schreiben %Vor%

Dies wird vom Compiler als Deklaration einer Funktion b interpretiert, die ein namenloses Argument übernimmt, bei dem es sich um eine parameterlose Funktion handelt, die A zurückgibt, was zu mysteriösen Fehlern führt. Dies ist bekannt als C ++ am ärgerlichsten Parse .

    
Nicola Musatti 05.09.2012 16:08
quelle
2

Ich bevorzuge den Klammerstil ... obwohl ich immer ein Leerzeichen verwende, um von Funktions- oder Methodenaufrufen zu unterscheiden, auf denen ich kein Leerzeichen verwende:

%Vor%

Einer der Gründe, weshalb ich dies für die Initialisierung generell bevorzuge, ist, dass es daran erinnert, dass es sich um eine nicht Aufgabe handelt. Daher werden Überladungen für den Zuweisungsoperator nicht angewendet:

%Vor%

Die Ausgabe ist:

%Vor%

Es fühlt sich an, als würde die Anwesenheit des Gleichheitszeichens den Unterschied verdecken. Auch wenn es "allgemein bekannt ist" möchte ich die Initialisierung deutlich anders aussehen lassen als die Zuweisung, da wir dazu in der Lage sind.

    
HostileFork 05.09.2012 16:12
quelle
1

Es ist nur die Syntax für die Initialisierung von etwas: -

%Vor%

Das sieht vernünftig aus, aber

%Vor%

Sieht seltsam aus, aber sie sind die gleiche Syntax.

    
jcoder 05.09.2012 15:43
quelle