2017-08-28 84 views
2

查看以下功能:C++使用和引用返回

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; 

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

回答

6

当传递一个字符串时,它会修改原始字符串的权利?

这是正确的。

试图更好地理解为什么有人可能用这种方式编码此功能?

它允许函数调用的链接。

在你的情况,你可以使用:

std::cout << foo(mystring) << std::endl; 

的函数调用链的一个例子是如何operator<<使用与std::coutoperator<<函数返回对ostream的引用。正因为如此,你可以使用:

std::cout << foo(mystring) << std::endl; 

否则,你将被迫使用:

std::cout << foo(mystring); 
std::cout << std::endl; 

我为什么不利用返回值的。

该语言不会强制您使用返回的值。但是,您可以使用它,如上所示。

4

当传递一个字符串时,它会修改原始字符串的权利?

正确。由于它是一个引用,它会修改调用者的对象。

为什么要在修改原始文件时返回修改过的字符串?

那么,如果你想连接调用,那么你需要通过引用返回对象。如果你没有,你不能使用

foo(foo(foo(some_string))); 

和我为什么不利用返回值吗?

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