2013-06-16 16 views
7
class Foo 
    { 


    }; 

    Foo f; 
    Foo g = f; // (*) 

Meine Frage ist, was heißt in der mit (*) markierten Zeile? Ist das die Standardkopie ctr oder '='?Konstruktor kopieren oder = Operator?

+0

Denken Sie daran, dass "default copy ctr" in diesem Fall eine falsche Bezeichnung ist. In C++ hat der Begriff "defualt constructor" eine spezielle, streng definierte reservierte Bedeutung, die nichts mit Ihrem Kopierkonstruktor zu tun hat. Was man in diesem Fall nennt, ist "* vom Compiler bereitgestellter * Kopierkonstruktor" oder "* impliziter * Kopierkonstruktor" oder etwas ähnliches. Aber dieser Kopierkonstruktor ist sicherlich nicht "* default * constructor". – AnT

Antwort

8

Meine Frage ist, was in der mit (*) markierten Zeile aufgerufen wird? Ist es die Standardkopie ctr oder '='?

Der Kopierkonstruktor wird aufgerufen.

Obwohl das = Zeichen verwendet wird, ist dies ein Fall von Initialisierung, wo das Objekt auf der linken Seite, indem den Ausdruck auf der rechten Seite als Argument für den Konstruktor aufgebaut ist.

Insbesondere diese Form der Initialisierung wird Kopie-Initialisierung genannt. Beachten Sie, dass, wenn der Typ des Initialisierer Ausdruck die gleiche wie die Art der initialisierten Klassenobjekt ist (Foo, in diesem Fall), Kopier-Initialisierung ist im Grunde äquivalent zu Direkt Initialisierung, dh:

Foo g(f); // or even Foo g{f} in C++11 

Der feine Unterschied besteht darin, dass, wenn der Kopierkonstruktor Foo als explicit markiert ist (schwer vorstellbar, warum das der Fall wäre), die Überladungsauflösung im Fall der Kopierinitialisierung fehlschlägt.

1
Foo g = f; // (*) 

Kopieren Konstruktor wird aufgerufen .It aufgerufen Kopie Initialisierung des Objekts.

Wenn Sie keinen Kopierkonstruktor innerhalb der Klasse Foo geschrieben haben, wird der vom Compiler erzeugte Kopierkonstruktor aufgerufen.

2

g wird tatsächlich als eine Kopie von f erstellt.

Ein einfacher Weg sich zu erinnern, was = eigentlich bedeutet, ist nur die Frage zu beantworten: ist g bereits vorhanden?

{ 
    Foo g; //g construction ends here (at ';') 
    g = f; // assignment (the g previous value is replaced) 
} 

{ 
    Foo g = f; //copy (same as Foo g(f): there is no "previous g" here) 
} 
+0

Bei g = f meinst du, das ist eine Zuordnung, so ist es eine "=" Operator-Nutzung, und nicht eine Kopie ctr richtig? –

+0

genau; Das liegt daran, dass g bereits existiert und oben erklärt wird. –

Verwandte Themen