2016-05-05 15 views
1

C++ 11 garantiert, dass std::string den Null-Terminator intern speichert. Wie kann das ohne eine explizite terminate Methode erreicht werden?Wie behält std :: string die NUL-Zeichenkette bei

Beispiel:

std::string foo("Baz"); 
printf("foo contains %s\n",&foo[0]); //Completely safe 
+2

Nicht sicher, dass ich die Frage verstehe. Können Sie mir erklären, was Sie meinen? Warum sollte beispielsweise eine "Beendigungs" -Methode notwendig sein? – erip

+0

Indem Sie intern einen Zeiger auf ein Array von mindestens 'size() + 1' Zeichen haben, wahrscheinlich mit einem Terminator als letztes Zeichen. –

+0

Der Zeichenfolgenkonstruktor kopiert die Zeichenfolge und fügt einen Nullabschluss hinzu. – Dani

Antwort

4

Der Standard verlangt, dass die Zeichenfolge, die Sie von data() erhalten ist NUL beendet, und verlangt, dass the references generated from operator[] are contiguous and NUL terminated. Das ist alles, was die Spezifikation dazu sagt.

Es ist die Aufgabe der Implementierung, das zu tun. In der Regel geschieht dies, indem nur ein NUL-Terminator am Ende der Zeichenfolge gespeichert wird, wodurch die tatsächliche Puffergröße um eins größer als angezeigt wird. Wenn Sie Zeichen hinzufügen, speichert es noch einen NUL-Terminator am Ende der neu angehängten Zeichenfolge. Wenn Sie Zeichen entfernen, wird der NUL-Terminator entsprechend verschoben.

Dies ist, was gekapselte Typen tun können. Sie können Invarianten herstellen und aufrechterhalten.