2013-07-22 15 views
5

Próbowałem dołączyć dwa listy do łańcucha, ale wydaje się, że łańcuch nie ulega zmianie:Issue sznurkiem :: operator + =

void fun() 
{ 
    string str; 
    str += 'a' + 'b'; 

    cout << str; 
} 

sprawdziłem kodu źródłowego STL i znalazł realizację operator+= , ale wciąż nie wiem dlaczego.

basic_string& 
operator+=(_CharT __c) 
{ 
    this->push_back(__c); 
    return *this; 
} 
+7

Zdajesz sobie sprawę, że ' 'a' + 'b'' ocenia do liczby całkowitej, a nie' "AB" ', prawda? –

+0

co to jest wartość początkowa 'str', którą robisz' str = str + 'a' + 'b'; ' –

+1

@GrijeshChauhan: lub bardziej efektywnie,' (str + = 'a') + = 'b'; '; -) –

Odpowiedz

7

Dodając 'a' + 'b' masz 2 znaki sumowane tworząc kolejną char. Następnie dodajesz go do ciągu znaków za pomocą +=.

Kod ten będzie robić to, co chcesz:

std::string str; 
(str += 'a') += 'b'; 

std::cout << str; 
2

nie używano ciąg tutaj. Użyj wyraźnego rzutowania. Lub zadeklaruj to jako zmienne łańcuchowe.

Np

void fun() 
{ 
    string str, str1 = 'a', str2 ='b'; 
    str += str1 + str2 

    cout << str; 
} 

LUB

void fun() 
{ 
    string str; 
    str += string("a") + 'b'; 

    cout << str; 
} 
+0

'' str + = "a" + "b"; '' - dodajesz tutaj 2 wskaźniki, a nie ciągi. –

+0

O tak! Dzięki za wskazówkę. :-) –

+1

'std :: string' nie ma konstruktorów z jednym parametrem' char'. – soon

3

Jak zazwyczaj umieścić sznurki w kodzie?

string str = "qaz123"; 

Można zrobić

str = str + " another string" 

jest (teoretycznie, w praktyce może to być cokolwiek) odpowiednik

str += " another string" 

Można użyć

str += 'a' 

ponieważ jest przeciążony operator typ char.

można próbować zrobić:

str += 'a' + 'b' 

Wypróbuj aplikację:

#include <typeinfo> 
#include <iostream> 

int main(void) 
{ 
    std::cout << typeid('a').name() << std::endl; 
    std::cout << typeid('a'+'b').name() << std::endl; 
} 

Wynik będzie wyglądać następująco:

c 
i 

co oznacza, że ​​'a'+'b' ocenia do liczby całkowitej.

Teraz pytanie brzmi: jaki operator jest rzeczywiście wywoływany, gdy wykonujesz str += 'a'+'b'.

Najprawdopodobniej wywoływany jest operator char z wartością znaków 195.

W moim systemie znak 195 to . Co to jest na twoim?

2

str + = 'a' + 'b'; po uruchomieniu tego, pojedynczy operator "+" jest poprzedzony złożonym operatorem "+ =", więc najpierw oblicza sumę dwóch symboli char, a suma wyników wynosi 195 (wartość ASCII "a" wynosi 97, "b" to 98), a następnie uruchom operator przeciążania "+" ciągu klasy. Śledź funkcję, zobaczysz, że jest to tylko akceptacja argumentu char, więc przekształca się w znak o wartości -61 (195-256 == - 61). ale jest niezadrukowanym symbolem, więc wynik wynosi 0 na końcu. oczywiście, nie możesz uzyskać nowego napisu w swoim desingu.

można przekodować tak:

string str; 
str += 'a'; 
str += 'b'; 
+1

+1, ale kilka małych punktów: implementacja zdefiniowała, czy znak "char" jest podpisany czy niepodpisany, więc wartość może wynosić 195 lub -61; "to niezadrukowany symbol, więc wynik wynosi 0 na końcu" - w rzeczywistości łańcuch z przyjemnością zapisuje wartość 195/-61, zajmując pojedynczy znak w 'str [0]', z 'str.size()' teraz 1. 'std :: string' może być używany do przechowywania dowolnych treści binarnych, w tym NUL-ów, co jest dogodne okazjonalnie. Niektórzy ludzie wolą używać 'std :: vector ' lub 'std :: vector ', gdy robią to, chcąc "wektor" interfejsu lub jako dokumentację. –

+0

Dziękuję za uwagę. masz rację – DarkHorse