Frage

Ich bin ein wenig verwirrt, warum ich habe gesagt, const foo von einem binären Operator in C ++ statt nur foo zurückzukehren.

Ich habe Bruce Eckel gelesen „in C ++ Denken“, und im Kapitel über die Überladen von Operatoren, sagt er, dass „durch den Rückgabewert zu machen [eine Überlastung Binäroperators] const, Sie feststellen, dass nur ein const Member-Funktion kann für diesen Rückgabewert bezeichnet werden. Dieses const-korrekt ist, weil es dich von der Speicherung potenziell wertvolle Informationen in einem Objekt verhindert, dass höchstwahrscheinlich „verloren gehen werden.

Wenn ich jedoch ein Plus-Operator, die const, und ein Präfix Inkrementoperator zurückgibt, dieser Code ist ungültig:

class Integer{
int i;

public:
    Integer(int ii): i(ii){ }
    Integer(Integer&);

    const Integer operator+();
    Integer operator++();
};


int main(){

Integer a(0);
Integer b(1);

Integer c( ++(a + b));
}

Um diese Art der Zuordnung zu ermöglichen, wäre es nicht sinnvoll, der Operator + hat einen nicht konstanten Wert zurückgeben? Dies könnte durch die Zugabe von const_casts getan werden, aber das wird ziemlich sperrig, nicht wahr?

Danke!

War es hilfreich?

Lösung

Wenn Sie sagen ++ x, du sagst „1 x hinzufügen, speichert das Ergebnis wieder in x, und sagen Sie mir, was es ist“. Dies ist der Prä-Operator. Aber in ++ (a + b), wie sollen Sie auf "speichern Sie das Ergebnis wieder in a + b"?

Sicher könnte man das Ergebnis speichern zurück in die temporären, die gegenwärtig ist das Ergebnis von a + b gehalten wird, die bald genug verschwinden würde. Aber wenn Sie nicht wirklich egal, wo das Ergebnis gespeichert wurde, warum Sie es erhöht haben, anstatt nur eine Zugabe?

Andere Tipps

FYI, ist ++(a + b) illegal sogar mit PODs (plain old Datentypen, wie int). So macht es Sinn, nicht für die eigenen Klassentypen entweder zu ermöglichen. Versuchen Sie folgendes:

int a = 1;
int b = 2;
int c = ++(a+b);

GCC kehrt error: lvalue required as increment operand.

In Ihrem Fall wäre es besser, Ihre Copykonstruktor machen ein const Integer Argument nehmen, und erstellen Sie Ihre Integer c wie folgt statt:

Integer c(a + b + Integer(1));

Kopierkonstruktoren in der Regel nehmen Sie ein const Referenz, dieses Problem für Sie zu lösen.

(nicht konstante Kopie Ctor Mit impliziert eine gewisse Übertragung von Ressourcen, die manchmal nützlich sein können, aber für 99% aller Situationen, ist es nicht erforderlich)

Ich glaube, OPs Beispiel auf die Frage, geeignet wäre, wenn der Additionsoperator mit einem anderen Binäroperators ersetzt wird, die einen Verweis zurückgibt, zum Beispiel eines Zuweisungsoperator:

Integer c( ++(a = b));

Ich kam hier die Frage, ob ich meinen Zuweisungsoperator eine const machen sollte oder eine nicht konstante Referenz zurück. Einige Tutorials verwende nicht-const-Versionen, im Gegensatz zu "Denken in C ++" 's Beratung. Und einige andere Referenzen geben Argumentation dahinter:

  

Beachten Sie, dass die zurückgegebene Referenz nicht const deklariert wird. Dies kann ein wenig verwirrend sein, weil es Ihnen erlaubt verrückt Sachen wie diese zu schreiben:

     
    

MyClass a, b, c;

         

...

         

(a = b) = c; // Was ??

  
     

Auf den ersten Blick könnten Sie wollen Situationen wie diese zu verhindern, indem Operator mit = Rück eine konstante Referenz. Allerdings Aussagen wie diese werden mit primitiven Typen arbeiten. Und, noch schlimmer, verlassen einige Werkzeuge tatsächlich auf dieses Verhalten. Daher ist es wichtig, eine nicht konstante Referenz von Ihrem Netzbetreiber zurück =. Als Faustregel ist: „Wenn es für ints gut genug ist, ist es gut genug für benutzerdefinierte Datentypen.“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top