了解返回字符串引用的函数中的"const"

Understanding the "const" in a function that returns a string reference

本文关键字:返回 const 函数 引用 了解 字符串      更新时间:2023-10-16

我有这个代码:

#include <cstdio>
#include <string>
using namespace std;
const string & func()
{
    static string staticString = "one";
    printf("%sn", staticString.c_str());
    return staticString;
}
int main( int argc, char ** argv )
{
    string firstString = func();
    firstString = "two";
    printf("%sn", firstString.c_str());
    func();
    return 0;
}

输出为

one
two
one

让我困惑的是,如果我从func()中删除const,输出完全相同。我原以为是:

one
two
two

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

string firstString = func();

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

const string& firstString = func();

如果您将func()更改为返回string&firstStringstring&类型,则修改func()内的字符串。

在本例中,const表示返回的引用不能用于修改字符串。您从来没有尝试过这样做,因为您将结果分配给了单独的对象字符串,而字符串与函数内部声明的静态字符串无关。

要查看正在播放的const,请按以下方式替换该行:std::string& firstString = func();您将看到它不允许您编译程序(前提是您仍然有常量std::string&作为func()的返回值(。错误就在这一行。现在,将行更改为const std::string& firstString = func();程序仍然无法编译,但现在在不同的行-firstString = "two";

现在有意义了吗?