我有这段代码:
#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()
?
答案 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";
现在有道理吗?