Auswirkungen der Verwendung eines kaufmännischen Und-Zeichens vor einem Funktionsnamen in C ++?

7

Gegeben sei das Beispiel:

%Vor%

Dabei ist m_Label eine private Klassenmitgliedsvariable.

Wie ich denke, dass ich es verstehe, gibt diese Funktion einen Verweis auf die Variable m_Label zurück. Was wären die Implikationen davon, dies während meines gesamten Programms zu verwenden, und wäre es besser, einfach den Wert anstelle der Referenz zurückzugeben? Vielen Dank!

    
Cuthbert 22.12.2011, 22:18
quelle

5 Antworten

6

Es gibt einen Verweis auf das private Mitglied zurück.

Es gibt viele Fälle, in denen dies wünschenswert ist, aber etwas Vorsicht ist geboten.

IMO Es ist im Allgemeinen keine gute Idee, eine Kopie eines internen Objekts, das kein integraler Typ ist, aus Gründen der allgemeinen Leistung zurückzugeben. Ja, ich weiß, vorzeitige Optimierung ist nicht gut, aber das ist nicht wirklich Optimierung, es ist nur eine gute Leistungspraxis, die es dem Anrufer ermöglicht, die Auswirkungen auf die Leistung zu bestimmen. Wenn es eine Kopie will, kann es einfach nicht die Variable deklarieren, der es als Referenz zugewiesen wird.

Es gibt zwei allgemeine Faustregeln, die ich hier verwende:

1) Wenn Sie nicht möchten, dass der Aufrufer das private Objekt direkt ändern kann, deklarieren Sie den Rückgabewert als const-Referenz:

%Vor%

2) Ein Aufrufer sollte niemals den von einer Klassenmethode zurückgegebenen Verweis speichern. Er sollte nur lokal verwendet werden, wenn das übergeordnete Objekt garantiert im Gültigkeitsbereich ist.

Wenn Sie aus irgendeinem Grund Anrufer benötigen, um einen Verweis auf Ihre internen Objekte speichern zu können, verwenden Sie stattdessen Smartpointer.

    
Gerald 22.12.2011, 22:41
quelle
11

Das Und-Zeichen steht nicht so lange vor dem Funktionsnamen wie nach dem Rückgabetyp. es gibt einen Verweis auf ein string zurück.

Dies hat zur Folge, dass ein Aufrufer dieser Funktion den Wert von m_label durch die Referenz ändern könnte. Auf der anderen Seite vermeidet es das Kopieren der Zeichenfolge. Möglicherweise möchten Sie, dass die Referenz und die Funktion const lauten, also:

%Vor%

Das Beste aus beiden Welten. Sie vermeiden die Kopie, aber Anrufer können Ihr Objekt nicht ändern.

    
Fred Larson 22.12.2011 22:22
quelle
2

Das Zurückgeben einer Referenz bedeutet, dass der aufrufende Code den Wert Ihrer Mitgliedsvariablen nach der Rückkehr ändern kann. Das ist sehr gefährlich, es sei denn, du hast das beabsichtigt.

Besser ist ein const Verweis oder Rückgabewert (ohne & ).

    
Mark Ransom 22.12.2011 22:24
quelle
2

Eine Implikation ist, dass wenn das einschließende Objekt zerstört wird, die Referenz ungültig wird:

%Vor%

Eine weitere Folge ist, dass ein Aufrufer die Zeichenfolge ändern kann. Sie können das beheben, indem Sie eine const-Referenz zurückgeben.

    
thesamet 22.12.2011 22:26
quelle
1

Du hast Recht. Es ist ein Verweis auf das String-Mitglied.

Die Implikation ist, dass, wenn ein Aufrufer einen Wert zuweisen oder die zurückgegebene Zeichenfolge ändern würde, dass sie auch die Elementvariable ändern würden. Wenn dies nicht die Absicht ist, können Sie eine Kopie nach Wert zurückgeben, um eine Kapselung zu vermeiden.

    
AJG85 22.12.2011 22:23
quelle