Frage zu Referenz



  • Das steht in der Header-Datei:

    plane(std::vector<std::vector<float> >const &);

    und das ist der Kopf der Implementation:

    plane::plane(vector<vector<float> >const &temp) : m_arr(temp.size())
    {...}

    In der Implementation wird der Inhalt aus temp nur nach m_arr kopiert.

    Das const kann nicht schaden, denk ich mir. Aber ist die Referenz sinnvoll oder überflüssig? Kommt sie überhaupt zum Tragen, findet nicht sowieso eine Referenzübergabe statt? Danke.



  • Ohne die Angabe einer Referenz findet in C++ nie eine Referenzübergabe statt.

    Deshalb würde dein ganzer vector bei jedem Aufruf von plane::plane() kopiert werden, um dann im Body erneut kopiert zu werden.

    Es erscheint mir auch sinnlos, innerhalb von plane::plane() den vector zu kopieren. Eigentlich sollte es auch so gehen:

    plane::plane(vector<vector<float> >const &temp) : m_arr(temp)  {}
    


  • ohne Referenz findet eine Wertuebergabe statt, d.h. Uebergabe per KOPIE. Das will man normalerweise nicht, ausser bei kleinen primitiven Typen wie int oder Zeigern.



  • Irgendjemand hier (Namen will ich jetzt nicht nennen) hat aber mal gesagt, dass es einige Fälle gibt, in denen dafaultmäßig eine Referenzübergabe vorgenommen wird. Das wäre bei Arrays der Fall. Also Humbug?



  • std::vector != BuiltIn-Array

    MfG SideWinder



  • Das widerspricht der Aussage Pontos.



  • Ingo schrieb:

    Irgendjemand hier (Namen will ich jetzt nicht nennen) hat aber mal gesagt, dass es einige Fälle gibt, in denen dafaultmäßig eine Referenzübergabe vorgenommen wird. Das wäre bei Arrays der Fall. Also Humbug?

    Auch Arrays werden nicht standardmäßig per Referenz übergeben. Es sieht nur so aus. Arrays werden implizit nach Pointer auf das erste Element umgewandelt und dieser Pointer wird dann per Value übergeben.



  • Das Problem ist imho die Verwendung des Begriffs "Referenzübergabe". Eine Referenzübergabe wird nicht durchgeführt - call by reference wird gemcaht. call by reference wird ja bei Pointern ebenfalls durchgeführt und ein BuiltIn-Array wird mit Hilfe eines Pointers auf das erste Element übergeben. Eine Referenz im Sinne von C++ ist das aber nicht.

    MfG SideWinder



  • Hi!

    Arrays sind mit den Zeigern sehr nahe verwandt. Wenn du als Parameter z.B. "char foo[]" hast und es in der Funktion veränderst, dann bekommst du das veränderte Array zurückgeliefert.

    #include <iostream>
    #include <cstring>
    
    void aender(char foo[])
    {
    	strcpy(foo, "Hallo");
    }
    
    int main()
    {
    	char foo[6] = "ich";
    	aender(foo);
    	std::cout << foo;
    }
    

    Es wird "Hallo" ausgegeben. Im Falle eines Arrays stimmt dies also. Das gilt aber nicht für einen vector, dabei handelt es sich um ein Objekt einer Klasse und das wird kopiert, sofern nicht anders angegeben (durch &, *).

    Code-Hacker


Anmelden zum Antworten