4

所以C++字符串函数

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

返回*this。这意味着什么?为什么我需要它来返回任何东西?

例子

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

会擦除j并变成immy,但为什么我需要它来返回任何东西?

4

4 回答 4

9

对于方法链。例如,在你擦除之后,你可以调用==它来检查一些东西:

string name = "jimmy";
bool b = name.erase(0,1) == "immy";
于 2013-01-02T11:16:52.337 回答
6

这只是为了方便,例如您可以像这样链接调用:

name.erase(0,1).erase(3,1);
于 2013-01-02T11:17:18.270 回答
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++ 中,他们只需要忍受标准库的设计者不同意的事实。

于 2013-01-02T11:49:10.173 回答
0

你可以这样做:

void process(std::string const &s) {}

process(name.erase(0,1)); //self-explanatory?

std::cout << name.erase(0,1) << std::endl; 

//etc

以及其他答案提到的事情。

于 2013-01-02T11:19:20.363 回答