22.5 – Присваивание и обмен значениями для объектов std::string
Присваивание строки
Самый простой способ присвоить значение строке – использовать перегруженную функцию operator=
. Существует также функция-член assign()
, которая дублирует некоторые из этих возможностей.
string& string::operator= (const string& str)
string& string::assign (const string& str)
string& string::operator= (const char* str)
string& string::assign (const char* str)
string& string::operator= (char c)
string& string::assign (const string& str)
string& string::operator= (const char* str)
string& string::assign (const char* str)
string& string::operator= (char c)
Эти функции присваивают строке значения различных типов. Они возвращают *this
, чтобы их можно было объединить в «цепочку».
Обратите внимание, что нет функции assign()
, которая принимает один символ char
.
Пример кода:
string sString;
// Присваиваем строковое значение
sString = string("One");
cout << sString << endl;
const string sTwo("Two");
sString.assign(sTwo);
cout << sString << endl;
// Присваиваем строку в стиле C
sString = "Three";
cout << sString << endl;
sString.assign("Four");
cout << sString << endl;
// Присваиваем символ char
sString = '5';
cout << sString << endl;
// Цепочка присваиваний
string sOther;
sString = sOther = "Six";
cout << sString << " " << sOther << endl;
Вывод:
One
Two
Three
Four
5
Six Six
Функция-член assign()
также имеет несколько других вариантов:
string& string::assign (const string& str, size_type index, size_type len)
Присваивает подстроку str
, начиная с позиции index
, и длиной len
.
- Выдает исключение
out_of_range
, если индекс выходит за границы строки. - Возвращает
*this
, чтобы можно было объединить в «цепочку».
Пример кода:
const string sSource("abcdefg");
string sDest;
// присваиваем подстроку из источника, начиная с индекса 2, длиной 4
sDest.assign(sSource, 2, 4);
cout << sDest << endl;
Вывод:
cdef
string& string::assign (const char* chars, size_type len)
Присваивает len
символов из массива символов в стиле C.
- Выдает исключение
length_error
, если результат превышает максимальное количество символов - Возвращает
*this
, чтобы можно было объединить в «цепочку».
Пример кода:
string sDest;
sDest.assign("abcdefg", 4);
cout << sDest << endl;
Вывод:
abcd
Эта функция потенциально опасна, и ее использование не рекомендуется.
string& string::assign (size_type len, char c)
Присваивает len
вхождений символа c
.
- Выдает исключение
length_error
, если результат превышает максимальное количество символов - Возвращает
*this
, чтобы можно было объединить в «цепочку».
Пример кода:
string sDest;
sDest.assign(4, 'g');
cout << sDest << endl;
Вывод:
gggg
Обмен значениями
Если у вас есть две строки, и вы хотите поменять их значения местами, вы можете использовать две функции с именем swap()
.
void string::swap (string &str)
void swap (string &str1, string &str2)
void swap (string &str1, string &str2)
Обе функции меняют местами значения двух строк. Функция-член меняет местами значения *this
и str
, глобальная функция меняет местами значения str1
и str2
.
Эти функции эффективны и должны использоваться вместо присваиваний для выполнения обмена значений строк.
Пример кода:
string sStr1("red");
string sStr2("blue");
cout << sStr1 << " " << sStr2 << endl;
swap(sStr1, sStr2);
cout << sStr1 << " " << sStr2 << endl;
sStr1.swap(sStr2);
cout << sStr1 << " " << sStr2 << endl;
Вывод:
red blue
blue red
red blue