理解" const"在一个返回字符串引用的函数中

时间:2015-10-01 21:23:12

标签: c++ reference constants

我有这段代码:

#include <cstdio>
#include <string>

using namespace std;

const string & func()
{
    static string staticString = "one";
    printf("%s\n", staticString.c_str());
    return staticString;
}

int main( int argc, char ** argv )
{
    string firstString = func();
    firstString = "two";
    printf("%s\n", firstString.c_str());
    func();
    return 0;
}

输出

one
two
one

困扰我的部分是,如果我从const删除func(),则输出完全相同。我原以为:

one
two
two

如果我从func()获取字符串引用(当它没有const关键字时),为什么会在重置时重置我再次致电func()

2 个答案:

答案 0 :(得分:5)

string firstString = func();

您将(通过引用)返回的字符串复制到firstString,因此您对firstString所做的更改不应影响静态本地。如果你这样做:

const string& firstString = func();

你会参考它,并看到你不允许修改它。如果您将func()更改为string&并将firstString更改为string&类型,那么您修改func()内的字符串

答案 1 :(得分:0)

在此示例中,const表示返回的引用不能用于修改字符串。您永远不会尝试这样做,因为您将结果分配给单个对象 - 字符串 - 这与您函数内声明的静态字符串无关。

要查看常量中的const,请将该行替换为: std::string& firstString = func();您将看到它不允许您编译程序(假设您仍然将const std::string&作为func()的返回值)。错误就在这一行。现在,将行更改为const std::string& firstString = func();程序仍然无法编译,但现在位于不同的行 - firstString = "two";

现在有道理吗?