Filestream an funktion

Hi,

ich habe ein kleineres(?) Verständnisproblem. Vielleicht kann mir da jemand weiter helfen?

also, auf der Suche nach einer Möglichkeit einen geöffneten File-Stream an eine Funktion zu uebergeben bin ich im usenet auf folgendes gestoßen:

void funktionsname(std::ifstream& ein)
{…}

nun, in meinem Programm funktioniert das auch, aber ich verstehe nicht ganz, was ich da gemacht habe :frowning:
Meine Gedanken waren folgende: ich uebergebe ja an die funktion ein Objekt (den Stream) aber was passiert im Hintergrund? wird dort eine Kopie des Objektes angelegt, und was hat eigentlich dieses std:: zu sagen und dieses Kaufmanns-und nach diesem ifstream?

bin für jeden Gedankenschub dankbar

cu micha

Input file stream ist im Namensraum (namespace) std (standard) deklariert. Das ist eigentlich der standard Namensraum fuer alle Schlüsselworter in ANSI C/C++.

Da es sich bei der Instanz von ifstream um ein Objekt handelt, übergibt man eine Referenz an funktionsname. Ansonsten muss bei der Uebergabe ueber den CopyKonstruktor eine Kopie erstellt werden. Der Copy-Konstruktor ist defaultmaessig immer implementiert, muss aber gegebenenfalls ueberschrieben werden,
wenn dynamische Komponenten im Spiel sind.

Ein Kopie wird erstellt bei:

void funktionsname(std::ifstream ein)
{…}

std:: kann man unter Umstaenden weglassen.

Es geht aber auch, wenn man zuvor schreibt:

using namespace std;

Der Grund fuer Namensraeume ist der, dass es keine Namenskonflikte gibt.
Angenommen ist erstelle eine eigene Klasse ifstream und Du bindest mein Include bei Dir ein,
dann kann ifstream und ifstream nicht mehr unterschieden werden. So schon:

namespace my {

class ifstream
{

};

} // EONS my

Denn dann gibt es my::ifstream und std::ifstream

Input file stream ist im Namensraum (namespace) std (standard)
deklariert. Das ist eigentlich der standard Namensraum fuer
alle Schlüsselworter in ANSI C/C++.

Da es sich bei der Instanz von ifstream um ein Objekt handelt,
übergibt man eine Referenz an funktionsname. Ansonsten muss
bei der Uebergabe ueber den CopyKonstruktor eine Kopie
erstellt werden. Der Copy-Konstruktor ist defaultmaessig immer
implementiert, muss aber gegebenenfalls ueberschrieben werden,
wenn dynamische Komponenten im Spiel sind.

Ein Kopie wird erstellt bei:

void funktionsname(std::ifstream ein)
{…}

das heißt, das bei meinem Beispiel eine Referenz übergeben wurde?!

und ist es auch möglich, einen Zeiger auf einen filestream aus einer Funktion zurueckzuuebergeben? müßte ja dann theoretisch irgendwie mit

std::ifstream *funktionsname(void)
{…}

gehen, oder irre ich da?

micha

Selbstverstaendlich koennen Funktionen auch Pointer zurueckgeben.
Man sollte aber immer darauf achten, das Scope und Lifetime des zurueckgegebenen Objektes Sinn machen.

Sowas wie in deinem Fall macht man oft bei Operatoren.
Z.b: macht der Transfer-Operator