Какая разница, если между действием следующих фрагментах:Есть ли какая-либо разница между + -ингными строками и << - строками в C++?
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
Какая разница, если между действием следующих фрагментах:Есть ли какая-либо разница между + -ингными строками и << - строками в C++?
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
Результат оператора + по строкам - это новая строка. Поэтому в примере
cout << "Some text" + s1 + "some more text\n";
Созданы две новые строки (подразумевается выделение памяти), прежде чем все это будет записано в cout. В первом примере все записывается непосредственно в cout без ненужного выделения памяти.
Во второй конкатенации строк перед отправкой их в COUT, который является падение производительности, потенциально довольно большой, с большими строками. Вы всегда хотите использовать первую форму, если сможете.
Да, 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 в)
Рассмотрим следующий пример:
cout << "Some text" + " " + "some more text\n";
Он не будет делать то, что ты думаешь. Оператор + не всегда означает конкатенацию.
Редактировать: При применении к необработанным строкам оператор + не объединяется - он добавляет адреса указателей к строкам. Результат почти гарантированно является бессмысленным, поскольку он указывает на область памяти, которая не имеет отношения ни к одной из исходных строк. Если повезет, это нарушит вашу программу.
Редактировать 2: По-видимому, прошло очень много времени с тех пор, как я совершил эту ошибку. Результаты настолько бессмысленны, что компилятор отказывается его компилировать.
Не стесняйтесь, объясните, что это добавление двух указателей. – tpdi
Да, пожалуйста, объясните подробнее. Я попробовал и получил ошибку. Почему это происходит? – 108
Вы просто не можете добавить указатели. Он даже не компилируется. – MSalters