C ++使用和返回引用

时间:2017-08-28 17:54:05

标签: c++ string reference

查看以下功能:

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;

为什么我没有使用返回的值?

2 个答案:

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

为什么我没有使用返回的值?

目前还不清楚为什么他们没有使用函数返回值,但你不必这样做。丢弃返回值是完全合法的。有一点需要注意的是倒数是不行的。如果你声明一个函数返回一些东西,而你却没有,那么这就是未定义的行为。