operator char * in der AWL-String-Klasse

7

Warum ist in der STL-String-Klasse kein überladener char * -Operator eingebaut? Gibt es einen bestimmten Grund, warum sie es vermeiden sollten?

Wenn es einen gab, würde die Verwendung der String-Klasse mit C-Funktionen viel bequemer werden.

Ich würde gerne Ihre Ansichten kennen.

    
Pallavi 17.08.2009, 07:41
quelle

6 Antworten

16

Nachfolgend ist das Zitat aus dem Buch von Josuttis STL:

  

Es gibt jedoch keinen automatischen Typ   Konvertierung von einem String-Objekt in eine   C-Saite. Dies ist aus Sicherheitsgründen   um unbeabsichtigte Typumwandlungen zu verhindern   das Ergebnis seltsames Verhalten (Typ   Char * hat oft seltsames Verhalten) und   Mehrdeutigkeiten (zum Beispiel in einem   Ausdruck, der eine Zeichenkette und   eine C-Saite wäre möglich   konvertiere String in char * und umgekehrt   versa). Stattdessen gibt es mehrere   Möglichkeiten zum Erstellen oder Schreiben / Kopieren in einem   C-String, insbesondere c_str () ist   bereitgestellt, um den Wert von a zu generieren   String als C-String (als Zeichen   Array, das '\ 0' als letztes hat   Zeichen).

    
Naveen 17.08.2009, 07:49
quelle
12

Sie sollten Cast-Operatoren immer vermeiden, da sie dazu neigen, Mehrdeutigkeiten in Ihren Code einzuführen, die nur durch die Verwendung weiterer Umwandlungen aufgelöst werden können, oder schlimmer noch kompilieren, aber nicht tun, was Sie erwarten. Ein char * () -Operator hätte viele Probleme. Zum Beispiel:

%Vor%

würde ohne Warnung kompilieren, aber die Zeichenfolge überlisten.

Eine const-Version wäre möglich, aber da Strings (möglicherweise) kopiert werden müssen, um sie zu implementieren, hätte dies unerwünschte versteckte Kosten. Die explizite Funktion c_str () bedeutet, dass Sie immer angeben müssen, dass Sie wirklich ein const char * verwenden möchten.

    
anon 17.08.2009 07:44
quelle
5

Die String-Template-Spezifikation ermöglicht bewusst eine "getrennte" Darstellung von Strings, wobei der gesamte String-Inhalt aus mehreren Chunks besteht. Eine solche Darstellung erlaubt keine einfache Umwandlung in char *.

Die Zeichenfolgenvorlage stellt jedoch auch die Methode c_str für genau den gewünschten Zweck bereit: Was ist falsch an der Verwendung dieser Methode?

    
Martin v. Löwis 17.08.2009 07:45
quelle
2

Von 1998-2002 war es ein heißes Thema von C ++ - Foren. Das Hauptproblem - Null-Terminator. Die Angabe von std ::? String erlaubt null Zeichen als normal, aber char * string nicht.

    
Dewfy 17.08.2009 07:47
quelle
2

Sie können stattdessen c_str verwenden:

%Vor%

Ich glaube, dass Sie in den meisten Fällen das char * nicht benötigen und bequemer mit der String-Klasse selbst arbeiten können.

    
Anna 17.08.2009 07:47
quelle
0

Wenn Sie Interoperabilität mit C-Style-Funktionen benötigen, ist die Verwendung von std::vector<char> / <wchar_t> oft einfacher.

Es ist nicht so praktisch, und leider können Sie nicht O (1) -wap es mit einem std::string (jetzt das wäre eine nette Sache).

In dieser Hinsicht bevorzuge ich die Schnittstelle von MFC / ATL CString , die strengere Leistungsgarantien hat, Interop bereitstellt und breite Zeichen- / Unicode-Zeichenfolgen nicht als völlig fremd behandelt (aber ok, letzteres ist etwas Plattform) Spezifisch).

    
peterchen 17.08.2009 08:04
quelle

Tags und Links