Kopie oder Pointer?

Thomasio

Erfahrenes Mitglied
Ich bin mir nicht ganz klar, was wann eine Kopie ergibt und wann nicht, vielleicht kann mich mal jemand aufklären?

In welchen der folgenden Fälle habe ich hinterher zwei voneinander unabhängige Werte bzw. strings?

int x = 1;
int y = x;

std::string x = "Irgendwas";
std::string y = x;

char x[] = "Irgendwas";
std::string y(x);

std::stringstream x;
x << "Irgendwas";
std::string y = x.str();

Mehr Beispiele fallen mir grad nicht ein, ich denke es ist eh klar was ich meine.
Gibt es für diese und andere Beispiele irgendeinen Anhaltspunkt, wann eine Kopie gemacht wird und wann nicht?
Und wenn etwas keine Kopie macht, wann geht mir der Inhalt verloren?
 
Hi ganz sicher bin ich mir nicht, aber nach logischem überlegen würde ich sagen das sind alles Kopien. Bei den ersten beiden aufjedenfall und die anderen beiden Beispiele höchstwahrscheinlich. Allein weil du nirgends einen Pointer definierst. Die String-Klasse z.B. wird das "=" überladen haben und somit eine Kopierfunktion haben.

Das kann man übrigens auch alles ausprobieren, wie sich das verhält :)
 
Hi.

Online-Skater hat Recht - es sind alles Kopien.

C++:
int x = 1; // Initialisierung von x mit 1
int y = x; // Initialisierung von y mit dem Wert von x

std::string x = "Irgendwas"; // Initialisierung, Konstruktor std::string(const char*) (²)
std::string y = x; // Initialisierung, Kopier-Konstruktor std::string(const std::string&) (³)

char x[] = "Irgendwas"; // Initialisierung von x mit "Irgendwas"
std::string y(x); // Initialisierung, Konstruktor std::string(const char*), wie (²)

std::stringstream x;
x << "Irgendwas";
std::string y = x.str(); // str() gibt einen string zurück, das Gleiche wie (³)


std::string x = "abc", y;

y = x; // Zuweisung, std::string& operator= (const std::string&)
// Hier entsteht keine Kopie, da y bereits existiert.
Mehr Beispiele fallen mir grad nicht ein, ich denke es ist eh klar was ich meine.
Gibt es für diese und andere Beispiele irgendeinen Anhaltspunkt, wann eine Kopie gemacht wird und wann nicht?
Immer wenn ein Konstruktor aufgerufen wird, wird logischerweise ein neues Objekt erstellt. Wenn du keine Referenzen oder Zeiger verwendest, werden immer Kopien angefertigt.

Gruß
 
Erstmal danke für die Antworten.
Ich hatte mir schon gedacht, dass das alles Kopien sind, bin nur verunsichert worden.
Genauer gesagt, ich habe mal irgendwo einen stringstream in ein char konvertiert:

Code:
std::stringstream x;
x << "irgendwas";
MessageBox(NULL, x.str().c_str(), "Message", MB_OK);

und da bekam ich von jemandem den Hinweis, dass diese Konstruktion gefährlich ist, weil .str() hier nur ein temporäres Objekt zurück gibt, was nicht lange lebt.
So lange ich dies nur für die direkte Ausgabe in der MessageBox verwende sicher kein Problem, aber allein dieser Hinweis hat mich dann verunsichert, was andere Variablen und deren Lebenszeit angeht.
 
Hallo,

wenn du ".c_str()" als Funktionsparameter verwendest, ist das unproblematisch, weil "MessageBox" innerhalb des Gültigkeitsbereiches der den Zeiger erzeugenden Funktion läuft. Du darfst es nur nicht als Rückgabewert in einer Funktion verwenden, weil ja dann der Gültigkeitsbereich verlassen wird.

STL-Objekte, also etwa ein string-Objekt via x.str(), kannst du problemlos als Parameter und Rückgabewert verwenden, da dabei immer jeweils eine Kopie auf dem Stack angelegt wird (Kopierkonstruktur).

Gruß
MCoder
 
Zurück