Das Prüfprogramm istWarum weder Konstruktor noch Zuweisungsoperator beim Deklarieren eines Objekts ausgeführt?
#include <iostream>
using namespace std;
class A
{public:
A(): I(0) {cout << "default construcot" << endl; };
explicit A (int i): I(i) {cout << "another construcot" << endl; };
A (const A& a): I(a.I) {cout << "copy constructor" << endl; }
A& operator = (const A& a)
{cout << "assignment operator" << endl;
if (this == &a) return *this;
I = a.I;
return *this;
}
void show() {cout << I << endl; };
private:
int I;
};
int main()
{A a = A(1);
A b;
b = A(2);
a.show();
b.show();
return 0;
}
der Ausgang
another construcot
default construcot
another construcot
assignment operator
1
2
zeigt, daß das Objekt 'a' im Gegensatz zu 'B' von A konstruiert wurde (1) "direkt" ohne Ausführung von Zuweisungsoperator. Aber der Kopierkonstruktor wurde nicht ausgeführt. Warum? Gibt es eine Möglichkeit, die Ausführung des Zuweisungsoperators in diesem Fall zu erzwingen? Ich würde ein solches Verhalten erwarten, wenn ich
schriebA a (1);
aber ich will
A a = A(1);
, die von dem ersten Fall unterscheidet sich haben. Oder nicht?
(In der Tat scheint das Problem, wenn ich eine Klasse B von A abgeleitet und will A den Zuweisungsoperator Erklärung wie A a = B (...) zu handhaben.)
Der Compiler-Schreiber war schlau genug, unnötige Aufrufe von Zuweisungsoperator/Kopierkonstruktor zu vermeiden. – DumbCoder
Warum interessieren Sie sich für die Zuordnung zu selbst? Wenn (dies == & a) 'die Klasse ist so einfach, dass es keine Rolle spielt. Wenn es komplexer war, dann sollten Sie das Kopieren und Tauschen von Idium verwenden, und dann wird der Test sowieso überflüssig. –