C++ 2 Fragen bezüglich Strings

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hiho,

Ich habe, wie im Titel erwähnt, 2 Fragen bezüglich Strings. Auf die erste Frage habe ich glaub ich schon eine Antwort gefunden bin mir aber noch nicht 100% sicher.


Frage 1:

In dem Buch, welches ich grade lese, steht eine Funktion die so aussieht:

Code:
void Nameanzeigen1 (const string &sName)
{
	cout << "Dein Name ist: " << sName << endl;
}

Nun Frage ich mich warum man, das ganze nicht so schreibt:

Code:
void Nameanzeigen2 ( string sName)
{
	cout << "Dein Name ist: " << sName << endl;
}

Die Syntax ist meiner Meinung nach einfacher zu lesen, der Effekt ist der selbe und der Schreibaufwand ist zudem noch geringer. Ich vermute jetzt, dass ich die erste SChreibweiße bevorzugen sollte, weil es Rechenleistung spart. Lieg ich da richtig?

Frage 2:

Was bewirkt bei follgender Funktion das "sName.c_str"?

Code:
void Nameanzeigen3 (const string &sName)
{
	cout << "Dein Name ist: " << sName.c_str << endl;
}

Es passiert genau das selbe, als bei der Ausgabe von "sName" weshalb ich mich Frage, was damit bewirkt werden soll "sName.c_str" zu schreiben..

Würde mich über eine Antwort freuen :)
 
1. Richtig, die Übergabe einer Referenz ist im Allgemeinen schneller als das Erstellen einer Kopie. Generell solltest du Objekte die größer sind als ein Zeiger immer als Referenz übergeben, oder eben als const Referenz wenn sie nicht verändert werden sollen (es sei denn du brauchst tatsächlich eine Kopie).

2. http://msdn.microsoft.com/en-us/library/3372cxcy(VS.71).aspx
 
1. Ob du by value oder by reference übergibst hängt prinzipiell von der Anwendung und zweck ab.
by Reference kopierst du lediglich den Pointer, also ist es bei dieser Anwendung auf jedenfall effizienter vom Speicherbedarf her.

2. In C gibt es keine strings, nur char-Arrays, es gibt viele Funktionen, welche char-Arrarys übergeben bekommen wollen. die Umwandlung funktioiniert ganz einfach mit .c_str()
 
cout ist C++ und nicht C
 
@roi: Was tut das zur Sache? (rhetorische Frage...) Es hat ja noch nicht mal jemand was gegenteiliges behauptet.

@Abcd12345:
Zu dem was eh schon gesagt wurde, ist die Überlegung eigentlich immer: Brauche ich eine Kopie? Wenn ja, dann ohne Referenz, wenn nicht, dann mit.

Deine zweite Variante unterscheidet sich zur ersten ja auch noch durch das const. D.h. der übergebene String (bzw. die Kopie davon) ist in der Funktion absichtlich und unabsichtlich veränderbar.
 
Arg C(++) ;)


schon zu lange her, dass ich mich damit ernsthaft beschäftigt habe oder wollte - wahrscheinlich auch wegen zu genannten Fallbeispielen.

Eine kleine Frage hätte ich daher an dieser Stelle:

const string &blah

ist dann die Referenz eine Konstante, also der Pointer auf die Speicheradresse, d.h. ich darf in nicht verbiegen, oder der Inhalt an dieser Adresse? ^^
 
Im Gegensatz zu pointern kannst du Referenzen nicht "umbiegen", eine Referenz zeigt nach ihrer Initialisierung immer auf das Objekt mit dem es initialisiert wurde.

"const string &blah" bewirkt also, dass das Objekt auf das die Referenz "zeigt" nicht verändert werden darf, und Sachen wie "string& const blah" machen wegen obiger Erklärung keinen Sinn.
 
string& const blah wäre auch ein Compile-Fehler ;-) string const& blah dagegen nicht und ist das selbe wie const string& blah ^^
 
Also mein Compiler meldet mir bei "string& const blah" keinen Fehler (ich wüsste auch nicht warum er sollte), er weist mich nur mit einer Warnung darauf hin, dass er das const ignoriert.
 
@the nacer
lordeder hat geschrieben das es bei C keine strings nur pointer arrays gibt, hier gehts ja aber um c++
 
Raechaer schrieb:
Also mein Compiler meldet mir bei "string& const blah" keinen Fehler

C++-Standard 8.3.2 Absatz 1:
Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef (7.1.3) or of a template type argument (14.3), in which case the cv-qualifiers are ignored.


(cv-qualified heißt: const oder volatile oder const-volatile)

@roi: In C++ gibt es auch Pointer-Arrays, falls du das noch nicht wussest *scnr* Wenn du die ursprüngliche Frage gelesen hättest, würdest du gesehen habe, dass es um die Methode c_str ging, die Pointer-Arrays im C-Style liefert...
 
Zuletzt bearbeitet:
stimmt, aber gibt es eben c++ in nicht nicht AUSSCHLIEßLICH pointerarrays?
 
Zurück
Oben