2009-04-08 11 views

ответ

15

Результат оператора + по строкам - это новая строка. Поэтому в примере

cout << "Some text" + s1 + "some more text\n"; 

Созданы две новые строки (подразумевается выделение памяти), прежде чем все это будет записано в cout. В первом примере все записывается непосредственно в cout без ненужного выделения памяти.

1

Во второй конкатенации строк перед отправкой их в COUT, который является падение производительности, потенциально довольно большой, с большими строками. Вы всегда хотите использовать первую форму, если сможете.

2

Да, string operator+ (const char* lhs, const string& rhs) создает и возвращает неназванный объект временной строки.

cout << "Some text" вызовы ostream & ostream :: Оператор < < (Const символ * Const) и возвращает ссылку ostream.

cout << "Some text" << s1 << "some more text\n"; 

является ostream::operator<<("Some text").operator<<(s1).operator<<("some more text\n"), три звонки на соиЬ, называя два разных перегруженных оп < <, оп < <, который принимает const* char* const и оп < <, который занимает const string&. Нет распределения памяти, и единственным копированием является буфер cout.

cout << "Some text" + s1 + "some more text\n"; 

является ostream::operator<<(t1) на временный объект строки, я буду называть t1, что t1 является временным результатом ::operator+ ("Some text", s1).operator+("some more text\n"). (Обратите внимание, что первый оператор + не является членом строки, но op + (const char * const, const string &) в области пространства имен. Он возвращает строку, поэтому вторая + "является строкой :: operator + (const char * const).

Таким образом, в этом коде создаются (а затем уничтожаются) временные строковые объекты. Это означает два внутренних представления для строк (так что два распределения памяти) и две копии, две недавно выделенные памяти (в дополнение к . копирование в буфер COUT в)

5

Рассмотрим следующий пример:

cout << "Some text" + " " + "some more text\n"; 

Он не будет делать то, что ты думаешь. Оператор + не всегда означает конкатенацию.

Редактировать: При применении к необработанным строкам оператор + не объединяется - он добавляет адреса указателей к строкам. Результат почти гарантированно является бессмысленным, поскольку он указывает на область памяти, которая не имеет отношения ни к одной из исходных строк. Если повезет, это нарушит вашу программу.

Редактировать 2: По-видимому, прошло очень много времени с тех пор, как я совершил эту ошибку. Результаты настолько бессмысленны, что компилятор отказывается его компилировать.

+0

Не стесняйтесь, объясните, что это добавление двух указателей. – tpdi

+0

Да, пожалуйста, объясните подробнее. Я попробовал и получил ошибку. Почему это происходит? – 108

+0

Вы просто не можете добавить указатели. Он даже не компилируется. – MSalters