Что означает возврат строки C++ *?
Так что строковая функция C++
string& erase ( size_t pos = 0, size_t n = npos )
возвращается *this
, Что это значит? Зачем мне это что-то возвращать?
пример
string name = "jimmy";
name.erase(0,1);
сотрет j
и стать immy
, но зачем мне вообще что-то возвращать?
4 ответа
Для метода сцепления. Например, после стирания вы можете позвонить ==
на это что-то проверить
string name = "jimmy";
bool b = name.erase(0,1) == "immy";
Это только для удобства, например, вы можете связывать вызовы следующим образом:
name.erase(0,1).erase(3,1);
В вашем примере вам не нужно ничего возвращать, потому что выражение:
name.erase(0,1)
эквивалентно:
((void)name.erase(0,1), name)
Например, вы можете написать:
while(name.erase(0,1).size()) {
std::cout << name << '\n';
}
или же:
while((name.erase(0,1), name).size()) {
std::cout << name << '\n';
}
или же:
while(name.erase(0,1), name.size()) {
std::cout << name << '\n';
}
или же:
while(true) {
name.erase(0,1);
if (!name.size()) break;
std::cout << name << '\n';
}
Стандарт решил предоставить вам выбор, вероятно, на основании того, что он может использовать возвращаемое значение для чего-то, а не "тратить" его.
По сути, он иногда сохраняет немного кода, который повторяет имя переменной или принимает ссылку на промежуточный результат.
Некоторые люди думают, что функции, которые модифицируют вызываемый ими объект, не должны ничего возвращать (идея заключается в том, чтобы ограничить использование функций с побочными эффектами до одной на оператор). В C++ им просто приходится жить с тем, что разработчики стандартной библиотеки не согласны.
Вы можете делать такие вещи:
void process(std::string const &s) {}
process(name.erase(0,1)); //self-explanatory?
std::cout << name.erase(0,1) << std::endl;
//etc
И вещи, о которых упоминали другие ответы.