2013-07-22 2 views
5

Я пытался добавить две буквы в строку, но мне кажется, что строка не изменяется:Проблемы с строкой :: оператором + =

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

    cout << str; 
} 

Я проверил исходный код STL и нашел реализацию operator+= , но я до сих пор не знаю, почему.

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

Вы понимаете, что ' 'а' + 'b'' вычисляет целое число, а не к' "AB" ', не так ли? –

+0

Что такое начальное значение 'str', которое вы делаете' str = str + 'a' + 'b'; ' –

+1

@GrijeshChauhan: или более эффективно,' (str + = 'a') + = 'b'; '; -) –

ответ

7

Добавляя 'a' + 'b' у вас будет 2 символов добавлены вместе, чтобы сформировать другой символ. Затем вы добавляете его в строку с +=.

Этот код будет делать то, что вы хотите:

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

std::cout << str; 
2

Вы не использовали здесь строку. Либо используйте явный приведение. Или объявите его как строковые переменные.

Например:

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

    cout << str; 
} 

ИЛИ

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

    cout << str; 
} 
+0

'' str + = "a" + "b"; '' - вы добавляете 2 указателя здесь, а не строки. –

+0

О да! Спасибо за совет. :-) –

+1

'std :: string' не имеют конструкторов с одним параметром' char'. – soon

3

Как вы обычно помещайте строки в коде?

string str = "qaz123"; 

Вы можете сделать

str = str + " another string" 

Который (теоретически, на практике это может быть что угодно) эквивалент

str += " another string" 

Вы можете использовать

str += 'a' 

потому что есть оператор, перегруженный для char type.

Вы пытаетесь сделать:

str += 'a' + 'b' 

Попробуйте это приложение:

#include <typeinfo> 
#include <iostream> 

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

Результат будет выглядеть так:

c 
i 

Что означает, что 'a'+'b' вычисляется в целое число.

Теперь возникает вопрос: какой оператор фактически вызывается, когда вы делаете str += 'a'+'b'.

Скорее всего, оператор char вызывается, значение char 195.

В моей системе 195 char . Что это на твоем?

2

str + = 'a' + 'b'; при запуске этого одиночного оператора «+» предшествует сложный оператор «+ =», поэтому сначала он вычисляет сумму двух символов символа, а результат суммы равен 195 (значение ASCII «a» равно 97, b, 98), затем запустите оператор перегрузки «+» строки класса. trace в функцию, вы обнаружите, что он принимает только аргумент char, поэтому он преобразуется в char со значением -61 (195-256 == - 61). но это непечатаемый символ, поэтому результат заканчивается 0. конечно, вы не можете получить новую строку по своему желанию.

вы можете перекодировать так:

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

+1, но несколько небольших точек: это реализация определена, является ли символ «char» подписанным или неподписанным, поэтому значение может быть равно 195 или -61; «это непечатаемый символ, поэтому результат равен 0» - на самом деле строка с радостью сохранит значение 195/-61, занимая один символ на 'str [0]', с помощью 'str.size()' now 1. 'std :: string' может использоваться для хранения произвольного двоичного содержимого, включая NUL, что удобно иногда. Некоторые люди предпочитают использовать 'std :: vector ' или 'std :: vector ' при выполнении этого, хотя, желая интерфейс 'vector' или как документацию. –

+0

Спасибо за внимание. Ты прав – DarkHorse

Смежные вопросы