查看以下功能:
std::string& foo (std::string& s)
{
s.erase(0.s.find_first_not_of(" \f\t\v\r\n");
return s;
}
当一个字符串传入时,它会修改原始字符串吗?当您还要修改原始文件时,为什么还要返回修改后的字符串?
试图更好地理解为什么某人可能以这种方式编码此功能?好吧有人这样做了所以我被问到为什么我只做以下事情:
std::string mystring = " This is cool";
foo(mystring);
std::cout << mystring << std::endl;
为什么我没有使用返回的值?
答案 0 :(得分:6)
当一个字符串传入时,它会修改原始字符串吗?
这是正确的。
试图更好地理解为什么某人可能以这种方式编写此函数?
它允许链接函数调用。
在您的情况下,您可以使用:
std::cout << foo(mystring) << std::endl;
函数调用的链接示例是operator<<
与std::cout
一起使用的方式。 operator<<
函数返回对ostream
的引用。因此,您可以使用:
std::cout << foo(mystring) << std::endl;
否则,您将被迫使用:
std::cout << foo(mystring);
std::cout << std::endl;
为什么我没有使用返回的值。
该语言不会强制您使用返回的值。但是,您可以使用它,如上所示。
答案 1 :(得分:4)
当一个字符串传入时,它会修改原始字符串吗?
正确。由于它是一个引用,它会修改来自调用者的对象。
为什么要在修改原始字符串时返回修改后的字符串?
好吧,如果你想将调用链接在一起,那么你需要通过引用返回对象。如果你没有,你就无法使用
foo(foo(foo(some_string)));
为什么我没有使用返回的值?
目前还不清楚为什么他们没有使用函数返回值,但你不必这样做。丢弃返回值是完全合法的。有一点需要注意的是倒数是不行的。如果你声明一个函数返回一些东西,而你却没有,那么这就是未定义的行为。