zu übergeben Ich hatte einen Midterm in C++ und eine unserer Zuweisungen war eine Klasse zu schreiben, die den <<
Operator überlädt, so dass wir private Felder dieser Klasse std::ostream
, wie so drucken könnten :Ist es obligatorisch, Klassen durch Referenz in C++
Crate c1(2600, 9500);
Crate c2;
cout << c1 << ", " << c2 << endl;
hatte Crate weight: 2600 Crate value: 9500, Crate weight: 0 Crate value: 0
Meine Umsetzung war
class Crate {
int weight;
int value;
public:
Crate():weight(0), value(0) {}
Crate (int w, int v);
Crate& operator+= (Crate& c);
int operator+= (int& w);
friend ostream& operator<< (ostream& out, Crate c) {
out << "Crate weight: " << c.weight;
out << " Crate value: " << c.value;
return out;
}
};
jedoch zu drucken, ich hat 0/3 Punkte für den überladenen Operator <<
bekommen, und der einzige Unterschied zwischen meiner Lösung und der Bewertungsschablone war, dass ich Crate c
nach Wert übertrage und sie als Referenz weitergegeben habe.
Wenn die Klasse dynamisch Elementvariablen zugewiesen hätte, müsste ich natürlich Instanzen davon als Referenz übergeben, aber das ist hier nicht der Fall.
Ich weiß, dass das Beispiel cppreference.com eine const-Referenz verwendet, aber gibt es eine strikte Regel, dass man eine const-Referenz verwenden muss, wenn Sie dies tun?
Ich verstehe, dass meine Lösung Kopien sowohl weight
und value
auf den Stapel statt nur einen Zeiger auf das Objekt zu kopieren, aber 4 Bytes ist (im Fall eines 32-Bit-Systems) auf dem Stack wirklich so viel von einem Problem oder fehlt mir etwas viel Ernsteres (wie ein Speicherleck)?
Ich überprüfte auch die Demontage beider Lösungen, aber ich konnte nichts finden, was meine Lösung Null Punkte wert wäre.
Ich habe auch meine Professoren gefragt, aber sie fingen an, darüber zu sprechen, es als const
zu übergeben, aber ich sehe nicht, wie das diese Lösung in Bezug auf Arbeiten besser machen würde/nicht funktioniert. Ein anderer Professor sagte mir, dass "das syntaktisch völlig falsch ist". aber es kompiliert mit Visual Studio und MinGW, so kann ich auch keinen Sinn machen.
Bitte beachten Sie auch, dass dies ein Kurs für Elektroingenieure ist.
Ich weiß nicht, ob ich damit einverstanden bin, dass es wert 0 ist, aber die Faustregel, die ich immer gehört habe, ist, wenn der Typ größer ist als sein Zeiger (im Grunde jedes nicht-primitive), durch Verweis gehen, und es sollte immer const sein, außer du brauchst unbedingt die Fähigkeit, es zu modifizieren. – Carcigenicate
@Carcigenicate 'struct Cls {int i; }; '=>' sizeof (Cls)
Ich weiß, dass das Überladen des Operators erfordert, dass der Iterationsparameter const ist. Allerdings sind diese Arten von technischen Details meines Wissens nicht bekannt. Hier ist eine Erklärung, die helfen könnte: http://StackOverflow.com/a/2828320/4775223 –