2011-01-21 16 views

Odpowiedz

41

C++ ciągi mieć konstruktora, który umożliwia konwertowanie ciągów C-style:

char* myStr = "This is a C string!"; 
std::string myCppString = myStr; 
+0

i teraz też muszę zrobić "delete myStr;' no? –

+0

@BarnabasSzabolcs Nie, to nie jest konieczne. Trzeba tylko usunąć pamięć przydzieloną za pomocą nowego. Wskaźniki do literałów ciągowych nie wymagają deallocacji. – templatetypedef

+0

Rozumiem, więc zgaduję, że string, tworzy wewnętrzną kopię tego znaku *. –

3

można zainicjalizować std::string bezpośrednio z c-string:

std::string s = "i am a c string"; 
std::string t = std::string("i am one too"); 
5

Sprawdź różnych konstruktorów klasa ciągów: documentation Być może zainteresuje Cię:

//string(char* s) 
std::string str(cstring); 

I:

//string(char* s, size_t n) 
std::string str(cstring, len_str); 
4

Jeśli masz na myśli char* do std::string można użyć konstruktora.

char* a; 
std::string s(a); 

Albo jeśli string s już istnieje, po prostu napisać to:

s=std::string(a); 
+1

Nie. Twój przykład spowodowałby błąd logiczny w konstruktorze std :: string. "a" nie może być NULL. –

1

w ogóle (bez deklarowania nowy magazyn) można po prostu użyć 1-Arg konstruktora zmienić C-łańcuch znaków na ciąg RValue:

string xyz = std::string("this is a test") + 
      std::string(" for the next 60 seconds ") + 
      std::string("of the emergency broadcast system."); 

jednak to nie działa przy konstruowaniu ciąg przekazać je poprzez odniesienie do funkcji (problem po prostu wpadł), np

void ProcessString(std::string& username); 
ProcessString(std::string("this is a test")); // fails 

Musisz zrobić odniesienie const odniesienia:

void ProcessString(const std::string& username); 
ProcessString(std::string("this is a test")); // works. 
3

C++11: przeciążenie operatora ciągiem znaków

std::string operator ""_s(const char * str, std::size_t len) { 
    return std::string(str, len); 
} 

auto s1 = "abc\0\0def";  // C style string 
auto s2 = "abc\0\0def"_s; // C++ style std::string 

C++14: użyć operatora z std::string_literals nazw

using namespace std::string_literals; 

auto s3 = "abc\0\0def"s; // is a std::string