Frage zu C++ Reference und anderen Quellen
-
Warum sollte man strcpy in C++ benutzen?
-
silent_max schrieb:
manni66 schrieb:
Wo werden da Beispiele in C geschrieben?
Ich habe z. B. die Funktion strncpy angeschaut.
Das ist ja auch eine C-Funktion! In C++ würde man doch von vornherein
char str1[]= "To be or not to be"; char str2[40]; char str3[40];vermeiden und stattdessen
std::string str1 = "To be or not to be"; std::string str2; std::string str3;nehmen, wo immer es möglich ist!
-
manni66 schrieb:
Warum sollte man strcpy in C++ benutzen?
Manni, es war nur ein Beispiel von vielen...
-
Dass zur Erläuterung der C-Funktionen Beispiele in C geschrieben sind, finde ich nun aber nicht sonderlich überraschend!
-
Das hier z. Bsp. habe ich gesucht:
http://en.cppreference.com/w/cpp/utility/functional
Eine Erläuterung von C++ Funktionen
-
silent_max schrieb:
manni66 schrieb:
Warum sollte man strcpy in C++ benutzen?
Manni, es war nur ein Beispiel von vielen...
Ja. Wenn du ein C Beispiel in der Referenz siehst, bist du vermutlich an der falschen Stelle, und solltest nach C++ suchen!
-
silent_max schrieb:
Das hier z. Bsp. habe ich gesucht:
http://en.cppreference.com/w/cpp/utility/functional
Eine Erläuterung von C++ Funktionen
Das erläutert kein Funktionen. Wenn du eine Erläuterung zu Funktionen brauchst, musst du ein C++ Lehrbuch verwenden aber sicher keine Referenz!
-
manni66 schrieb:
Das erläutert kein Funktionen. Wenn du eine Erläuterung zu Funktionen brauchst, musst du ein C++ Lehrbuch verwenden aber sicher keine Referenz!
Glaubst Du, dass ein C++ Lehrbuch auslangt?
-
silent_max schrieb:
manni66 schrieb:
Das erläutert kein Funktionen. Wenn du eine Erläuterung zu Funktionen brauchst, musst du ein C++ Lehrbuch verwenden aber sicher keine Referenz!
Glaubst Du, dass ein C++ Lehrbuch auslangt?
Wenn es gut ist und man es liest.

-
Sone schrieb:
Wenn es gut ist und man es liest.

Wenn man es durcharbeitet.
Das ist ein Lehrbuch. Zum lernen, nicht nur für schöne Gedanken.
-
DirkB schrieb:
Sone schrieb:
Wenn es gut ist und man es liest.

Wenn man es durcharbeitet.

-
silent_max schrieb:
Also sprich, ich könnte alles, was in C möglich ist, auch in C++ machen?? Ich muss es nur schaffen, die Beispiele auf http://en.cppreference.com/w/ und http://www.cplusplus.com/reference/ auf C++ zu transfermieren?
Korrekt, du brauchst nichtmal was transferieren. C++ ist eine Erweiterung von C, hieß auch mal C mit Klassen. Es gibt die Ausnahme mit dem impliziten Cast von void * auf einen beliebigen Pointer was in C geht und in C++ nicht, aber ansonsten geht alles in C++ genauso wie in C.
Allerdings hat C++ versucht bessere oder zumindest andere Möglichkeiten bereit zu stellen, sodass es häufig zwei Möglichkeiten gibt. char * vs std::string, x[] vs std::vector<x>, printf vs std::cout, malloc/free vs new/delete ....
Nicht immer sind die C++-Varianten besser. Häufig wird es aber als schlechten Stil angesehen wenn man die Varianten mischt und Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.
Du solltest für dich entscheiden, ob du strikt C++ machen willst, alla "C ist Teufelszeug" oder auch die C-Funktionen nutzen willst. Wenn du reines C++ willst, was keine schlechte Idee ist, dann solltest du #includes, die mit .h enden oder mit c anfangen eher meiden (gibt sicher Ausnahmen).*wartet auf Sones gepolter* :trollface:
-
geht alles in C++ genauso wie in C.
Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.
char * vs std::string
Das ist kein Kampf.
std::stringhat so gut wie überall gewonnen. Ausnahme: absolute Performance.malloc/free vs new/delete
mallocundfreesind in C++ absolut Tabu.Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.
printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit
cout(bspw. Failbits). Daher sollte es einfach nicht verwendet werden.Wenn du reines C++ willst, was keine schlechte Idee ist, dann solltest du #includes, die mit .h enden oder mit c anfangen eher meiden (gibt sicher Ausnahmen).
Nein, der ganze Tipp ist Blödsinn.
*wartet auf Sones gepolter* :trollface:
Nach so eine Post ist das ja auch kein Wunder.
-
std::string verwendet Heap-Allocation (ausser bei extrem kurzen Strings) und ist somit gar nicht so toll wie hier immer angepriesen wird. Jede Heap-Allocation ist sau teuer.
-
std::stringist eine Stringklasse für den Alltag. Sie hat gar nicht den Anspruch, in jeder möglichen Situation die beste zu sein. Ihr Design ist auch umstritten, ausserdem kommt man im Bezug auf Locales und Unicode an die Grenzen.Fakt ist:
char*mit manueller Speicherverwaltung ist keine Alternative. Das ist schlicht zu fehleranfällig und benötig zu viel Boilerplate-Code, um produktiv eingesetzt zu werden. Für spezifische Anwendungsszenarien nimmt man sich eine auf den Fall zugeschnittene Klasse oder implementiert selbst eine.
-
Sone schrieb:
geht alles in C++ genauso wie in C.
Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.
Zeig mal ein Beispiel, dass in C geht und in C++ nicht.
Sone schrieb:
Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.
printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit
cout(bspw. Failbits). Daher sollte es einfach nicht verwendet werden.Natürlich nicht. Als printf entworfen wurde hat niemand gedacht, dass es ein Objekt für Ausgaben geben könnte. Genauso gut könnte man sagen, dass cin schlecht ist, weil es nicht mit fscanf kooperiert.
Sone schrieb:
char * vs std::string
Das ist kein Kampf.
std::stringhat so gut wie überall gewonnen. Ausnahme: absolute Performance.Ich habe nicht von Kämpfen gesprochen, sondern von einem C-Weg und einem C++-Weg, die am Ende dasselbe tun, aber irgendwie doch verschieden und häufig inkompatibel zueinander sind.
-
nwp3 schrieb:
Sone schrieb:
geht alles in C++ genauso wie in C.
Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.
Zeig mal ein Beispiel, dass in C geht und in C++ nicht.
void f(const a); int main(void) {return 0;}nwp3 schrieb:
Sone schrieb:
Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.
printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit
cout(bspw. Failbits). Daher sollte es einfach nicht verwendet werden.Natürlich nicht. Als printf entworfen wurde hat niemand gedacht, dass es ein Objekt für Ausgaben geben könnte. Genauso gut könnte man sagen, dass cin schlecht ist, weil es nicht mit fscanf kooperiert.
Dafür ist
std::cinim Gegensatz zufscanfTypsicher, IMO lesbarer und besser auf Fehler prüfbar.Oder wie viele C-Programmierer die du kennst, prüfen nach jedem Benutzen von
fscanf feof(stdin)oderferror(stdin)?
Oder den Rückgabewert?nwp3 schrieb:
Sone schrieb:
char * vs std::string
Das ist kein Kampf.
std::stringhat so gut wie überall gewonnen. Ausnahme: absolute Performance.Ich habe nicht von Kämpfen gesprochen, sondern von einem C-Weg und einem C++-Weg, die am Ende dasselbe tun, aber irgendwie doch verschieden und häufig inkompatibel zueinander sind.
std::stringhat wieder deutliche Vorteile gegenüber C-Strings, die dir eigentlich bekannt sein sollten.
-
prot schrieb:
std::string verwendet Heap-Allocation (ausser bei extrem kurzen Strings) und ist somit gar nicht so toll wie hier immer angepriesen wird. Jede Heap-Allocation ist sau teuer.
Diese Kost muss man tragen, wenn man berücksichtigt, wie klein der Stack nur ist.
ausserdem kommt man im Bezug auf Locales und Unicode an die Grenzen.

-
Sone schrieb:
nwp3 schrieb:
Sone schrieb:
geht alles in C++ genauso wie in C.
Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.
Zeig mal ein Beispiel, dass in C geht und in C++ nicht.
void f(const a); int main(void) {return 0;}Etwas praxisnäher:
int *foo = malloc(2*sizeof(int));Oder aktueller:
auto int foo;Kaum bekannt, aber interessant:
sizeof('c');Ein bisschen was freches:
int static_cast;Einer der wohl bekanntesten Fälle:
char *non_const = "Literal";Aus dem Standard ein überraschendes Beispiel:
char arr[100]; sizeof(0, arr); // 100 in C++, sizeof(char*) in CAuch sehr oft in der Praxis benutzt:
enum autos{vw, bmw, benz}; enum autos auto = 1;Ich könnte noch den ganzen Tag weitermachen, aber wenn wirklich Interesse besteht, dann lese man den C++-Standard. Der hat ein (ziemlich langes) Kapitel über Inkompatibilitäten.
-
char *non_const = "Literal";Gibt AFAIR nur eine Warnung. Das kompiliert in C++ meines Wissens nach.
Ich guck aber sicherheitshalber noch mal nach... :xmas2:
Edit: Ja, hatte Recht. G++ (4.8!) gibt nur eine deprecated Warnung.
Warte, ich schlag mal nach.