2016-02-24 8 views
5

Arrays können als Zeiger auf eine Funktion oder sogar als Referenz übergeben werden. Wenn Sie es als Referenz übergeben, erhalten Sie einen Alias, mit dem auch die Operatoren sizeof und count funktionieren. Dies macht Pass-by-Reference-Look überlegen.C++: Ist es normal Array Referenz auf Funktion zu übergeben

Allerdings scheint Zeiger in Büchern die Norm zu sein. Warum? Gibt es etwas, das ich besonders über Pass-by-Reference für Arrays wissen muss?

Antwort

5

Durch Verweis übergeben bedeutet, dass Ihre Funktion nur Arrays mit fester Größe akzeptieren kann (deshalb kennt sie ihre Größe, weil der Compiler sie erzwingt). Passing by Pointer bedeutet etwas anderes. Übergeben mit dem Zeiger können Sie auch nullptr übergeben, für besser oder schlechter.

+1

! Wird ein dynamisch zugewiesenes Array nicht als Parameter für den Verweis akzeptiert? Woher? Eine Referenz ist schließlich ein Alias. – quantum231

+0

@ quantum231 Die dynamische Zuweisung eines Arrays gibt bereits einen Zeiger zurück, also nein. –

+1

Es gibt keine automatische Zuweisung, aber es gibt ein Typenproblem. Beispiel: 'void f (int (& arg) [5]);' 'void g() {f (* neu int [1] [5]);}' –

1

Ich verwende normalerweise std::vector und gerne durch const Referenz übergeben. Das heißt, wenn meine API an irgendeinem Punkt durch c-Code aufgerufen werden kann, kann die Verwendung von pass by const Pointer sinnvoll sein, obwohl Sie dann auch die Größe senden möchten. Wenn die Funktion mit oder std::vector aufgerufen werden kann, können Sie einen Zeiger (und eine Größe) oder eine Reihe von Iteratoren (Anfang/Ende) senden.

Wenn wir über die Verwendung von std :: array sprechen, benötigt das Template-Argument die Größe des Arrays. Dies würde in einer normalen Funktion bedeuten, Sie eine feste Größe benötigen würden:

void myfunc(const std::array<int, 5>& mydata){...} 

Wenn wir jedoch eine Templat-Funktion, Templating auf Größe zu tun, das ist kein Problem mehr.

template<unsigned int SZ> 
void myfunc(const std::array<int, SZ>& mydata) {...} 

Wenn wir sprechen über Stapel reserviert c-style-Arrays ... Gut C++ Stil ist zu std :: array/std :: vector c-style-Arrays bevorzugen. Ich würde empfehlen zu lesen C++ Coding Standard by Herb Sutter Kapitel 77 auf Seite 152 spricht über das Thema. Bei Verwendung von c-artigen Arrays ist das Senden des Mauszeigers und der Größe der Standardweg.

Verwandte Themen