16 Stimmen

Welche Bedeutung hat die Rückgabe durch Verweis?

In C++,

function() = 10;

funktioniert, wenn die Funktion eine Variable per Referenz zurückgibt.

Was sind die Anwendungsfälle dafür?

20voto

Der häufigste Fall ist die Implementierung von Dingen wie operator[].

struct A {
    int data[10];
    int & operator[]( int i ) {
         return data[i];
    }
};

Eine andere Möglichkeit ist die Rückgabe eines großen Objekts aus einer Klasse über eine Accessor-Funktion:

struct b {
    SomeBigThing big;
    const SomeBigThing & MyBig() const {
         return big;
    }
};

um den Kopieraufwand zu vermeiden.

7voto

Betrachten Sie den folgenden Code: MyFunction gibt einen Zeiger auf einen int zurück, und Sie setzen einen Wert auf diesen int.

int  *i;
i = MyFunction();
*i = 10;

Kürzen Sie das jetzt auf

*(MyFunction()) = 10;

Er bewirkt genau dasselbe wie der erste Codeblock.

Sie können eine Referenz als einen Zeiger betrachten, der immer dereferenziert wird. Wenn meine Funktion also einen Verweis - und keinen Zeiger - auf einen int zurückgibt, würde der erste Codeblock wie folgt aussehen

int  &i;
i = MyFunction();
i = 10;

und die zweite würde zu

MyFunction() = 10;

Das ist es, wonach ich gesucht habe

4voto

Alexandre C. Punkte 53706

Getters/Setters zum Beispiel

class C
{
    int some_param_;
public:
    int& param() { return some_param_; }
    int const& param() const { return some_param_; }
};

aber hier sollten Sie some_param als öffentlichen int verwenden. Container bieten Funktionen, die per Referenz zurückgeben, z. B. vector<T>::operator[] so dass Sie schreiben können v[k] = x .

3voto

Naveen Punkte 71443

Ein ganz normaler Anwendungsfall ist, wenn Sie eine arrayähnliche Klasse schreiben. Hier wollen Sie die operator [] so wie Sie es tun können a[0] = 10; In diesem Fall sollte die Signatur wie folgt aussehen int& operator[](int index);

2voto

ereOn Punkte 50658

Wenn Sie eine Klasse haben, die eine andere Struktur enthält, kann es nützlich sein, die enthaltene Struktur direkt zu ändern:

struct S
{
    int value;
};

class C
{
    public:

        S& ref() { return m_s; }

    private:

        S m_s;
};

Ermöglicht es Ihnen, etwas zu schreiben wie:

void foo()
{
    C c;

    // Now you can do that:

    c.ref().value = 1;
}

Hinweis: In diesem Beispiel könnte es einfacher sein, direkt die m_s öffentlich, anstatt eine Referenz zurückzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X