什么C ++字符串擦除返回*这意味着什么?

时间:2013-01-02 11:15:31

标签: c++ string erase

所以C ++字符串函数

string& erase ( size_t pos = 0, size_t n = npos )

返回*this。那是什么意思?为什么我需要它来返回任何东西?

实施例

string name = "jimmy";  
name.erase(0,1);

将删除j并成为immy,但为什么我需要它才能返回任何内容?

4 个答案:

答案 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

其他答案提到的事情。