Что означает возврат строки 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

И вещи, о которых упоминали другие ответы.

Другие вопросы по тегам