所以C ++字符串函数
string& erase ( size_t pos = 0, size_t n = npos )
返回*this
。那是什么意思?为什么我需要它来返回任何东西?
实施例
string name = "jimmy";
name.erase(0,1);
将删除j
并成为immy
,但为什么我需要它才能返回任何内容?
答案 0 :(得分:9)
方法链接。例如,擦除后,您可以在其上调用==
来检查某些内容:
string name = "jimmy";
bool b = name.erase(0,1) == "immy";
答案 1 :(得分:6)
这只是为了方便起见,例如你可以链接这样的呼叫:
name.erase(0,1).erase(3,1);
答案 2 :(得分:3)
在你的例子中,你不需要它返回任何东西,因为表达式:
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 ++中,他们只需要接受标准库的设计者不同意这一事实。
答案 3 :(得分:0)
你可以这样做:
void process(std::string const &s) {}
process(name.erase(0,1)); //self-explanatory?
std::cout << name.erase(0,1) << std::endl;
//etc
其他答案提到的事情。