Typumwandlung bei Operatoren
-
Hallo zusammen...
folgendes kleines Konstruktclass A {}; class B { public: B() { cout<<"StdK"<<endl; } B(int i) { cout<<"IntK"<<endl;} B(const A&) { cout<<"CpyK"<<endl; } }; int operator+ (const B&, const B&) {return 1;} int main() { A a; a+5; }
klappt wunderbar.
Ändert man allerdings beim operator+ den Typ der Argumente von const B& in B& um, gibt's plötzlich Fehler.
Kann mir jemand erklären, wieso?
Im voraus schonmal danke!
-
Temporäre Objekte können nicht an non-const-Referenzen gebunden werden.
-
Sinn würde es auch keinen machen, da Operator+ die beiden Argumente nicht verändert.
-
Danke für die schnelle Antwort!
Spielt es eigentlich performancemäßig eine Rolle,
ob man in dem Fall, in dem die Parameter nicht übereinstimmen,
bei einer Funktion eine Referenz oder direkt das Argument übergibt?(theoretisch könnte das erzeugte temporäre Objekt ja gleich auf dem Aktivierungsbereich der Funktion erzeugt werden und muss nicht mehr kopiert werden -> sogar schneller als noch ne Referenz auf das Objekt zu erzeugen)
-
call by reference ist bei keinen builtin-Typen meistens schneller, bei non-POD Typen sollte es fast immer so sein.
Das hängt aber von der Größe der Klasse ab, weil eine Referenz intern als Zeiger gehandhabt wird, beschränkt sich die Übergabe auf eine Adresse.MfG Eisflamme
-
@Mis2com:
Dass call-by-reference bei großen Objekten schneller ist, ist mir klar.Nur müssten bei temporären Objekten diese ja eigentlich nicht kopiert werden, sondern könnten direkt auf dem Funktionsstack angelegt werden. -> geringfügig schneller als call-by-reference
Die Frage ist, ob der Compiler das so macht...