Frage

In einem Projekt, das ich halte, sehe ich eine Menge Code, wie dies für einfache get / set Methoden

const int & MyClass::getFoo() { return m_foo; }

void MyClass::setFoo(const int & foo) { m_foo = foo; }

Was ist der Punkt, dass anstelle der folgenden Aktionen?

int MyClass::getFoo() { return m_foo; }  // Removed 'const' and '&' 

void MyClass::setFoo(const int foo) { m_foo = foo; }  // Removed '&'

einen Verweis auf eine primitive Art Passing sollte die gleiche (oder mehr) Aufwand erfordern den Typ des Wertes als Übergang selbst, nicht wahr?
Es ist nur eine Zahl, nachdem alle ...
Ist das nur einige versucht Mikro-Optimierung oder gibt es einen echten Nutzen?

War es hilfreich?

Lösung

Der Unterschied ist, dass, wenn Sie dieses Ergebnis in eine Referenz erhalten Sie sich die Änderungen des ganzzahligen Membervariable in Ihrem eigenen Variablennamen ohne Hinweis auf die Funktion verfolgen kann.

const &int x = myObject.getFoo();
cout<<x<<endl;
//...
cout<<x<<endl;//x might have changed

Es ist wahrscheinlich nicht die beste Design Wahl, und es ist sehr gefährlich, eine Referenz (const oder nicht), falls eine Variable zurückzugeben, die von Umfang befreit wird zurückgegeben. Also, wenn Sie einen Verweis zurückgeben, vorsichtig sein, sicherzustellen, dass es nicht eine Variable, die den Gültigkeitsbereich verlässt.

Es gibt einen kleinen Unterschied für den Modifikator zu, aber auch hier wahrscheinlich nicht etwas, das wert ist, getan oder dass beabsichtigt war.

void test1(int x)
{
  cout<<x<<endl;//prints 1
}

void test2(const int &x)
{
  cout<<x<<endl;//prints 1 or something else possibly, another thread could have changed x
}

int main(int argc, char**argv)
{
  int x = 1;
  test1(x);
  //...
  test2(x);
  return 0;
}

Also das Endergebnis ist, dass Sie die Änderungen auch erhalten, nachdem die Parameter übergeben werden.

Andere Tipps

Für mich, vorbei an einer konstante Referenz für Primitiven ist ein Fehler. Entweder müssen Sie den Wert ändern, und in diesem Fall übergeben Sie eine nicht konstante Referenz , oder Sie brauchen nur auf den Wert zuzugreifen und in diesem Fall übergeben Sie ein const .

Const Referenzen sollten nur für komplexe Klassen verwendet werden, beim Kopieren von Objekten ein Performance-Problem sein könnten. Im Fall von Primitiven, wenn Sie den Wert der Variablen ändern müssen, sollten Sie nicht einen Verweis übergeben . Der Grund dafür ist, dass Referenzen als mehr Rechenzeit nehmen nicht-Referenzen , da mit Referenzen , muss das Programm in einer Tabelle nachschlagen zu finden die Adresse des Objekts. Wenn dieser Look-up-Zeit kürzer als die Kopierzeit ist, sind Referenzen eine Verbesserung.

Im Allgemeinen ints und Adressen hat die gleiche Byte Länge in Low-Level-Implementierungen. So ist die Zeit des Kopierens ein int als Rückgabewert für eine Funktion äquivalent der Zeit, ist ein des Kopierens Adresse . Aber in dem Fall, in dem ein int zurückgegeben wird, wird kein Look ausgeführt, damit die Leistung erhöht wird.

Der Hauptunterschied zwischen einem Wert zurückgibt und eine konstante Referenz Rückkehr ist, dass man dann diese Referenz const_cast und den Wert verändern.

Es ist ein Beispiel für schlechtes Design und der Versuch, ein intelligentes Design, wo einfaches und prägnantes Design mehr als genug zu schaffen wäre. Anstatt nur einen Wert zurückgibt der Autor die Leser des Codes macht denken, was die Absicht hatte er sein könnte.

Es gibt nicht viel Nutzen. Ich habe dies in Rahmen gesehen oder Makro erzeugt Getter und Setter vor. Der Makrocode nicht zwischen primitiven und nicht-POD-Typen und nur verwendet const type& auf der ganzen Linie für Setter. Ich bezweifle, dass es sich um eine Effizienz Problem oder ein echtes Missverständnis ist; Chancen sind dies eine Konsistenz Problem ist.

Ich denke, diese Art von Code geschrieben ist, der das Konzept der Referenzen falsch verstanden hat und es für alles, einschließlich primitiven Datentypen verwenden. Ich habe auch einige Codes wie diesen gesehen und kann nicht sehen, dies keinen Nutzen zu tun.

Es gibt keinen Sinn und Nutzen außer

void MyClass::setFoo(const int foo)
void MyClass::setFoo(const int& foo)

als dann werden Sie nicht in der Lage sein, ‚foo‘ Variable innerhalb Implementierung ‚setFoo‘ wiederzuverwenden. Und ich glaube, dass ‚int &‘ ist nur, weil Guy gerade gewöhnt alle Dinge durch konstante Referenz passieren und es ist nichts falsch mit dem.

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