C++ 了解",;常数;在返回字符串引用的函数中

C++ 了解",;常数;在返回字符串引用的函数中,c++,reference,constants,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

我有以下代码:

#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;
}
让我困惑的是,如果我从
func()
中删除
const
,则输出完全相同。我希望是:

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

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

const string& firstString = func();
您将引用它,并确保不允许修改它。如果将
func()
更改为返回
string&
,将
firstString
更改为
string&
类型,则将修改
func()
中的字符串

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

const string& firstString = func();

您将引用它,并确保不允许修改它。如果将
func()
更改为返回
string&
,将
firstString
更改为
string&
类型,则将修改
func()
中的字符串。在本例中,const表示返回的引用不能用于修改字符串。您永远不会尝试这样做,因为您将结果分配给单个对象-字符串-它与函数中声明的静态字符串无关

要查看正在运行的常数,请按如下方式替换该行:
std::string&firstString=func()
您将看到它不允许您编译程序(前提是您仍然将const
std::string&
作为
func()
的返回值)。错误将出现在这一行。现在,将行更改为
const std::string&firstString=func()程序仍将无法编译,但现在位于不同的行-
firstString=“two”


现在有意义了吗?

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

要查看正在运行的常数,请按如下方式替换该行:
std::string&firstString=func()
您将看到它不允许您编译程序(前提是您仍然将const
std::string&
作为
func()
的返回值)。错误将出现在这一行。现在,将行更改为
const std::string&firstString=func()程序仍将无法编译,但现在位于不同的行-
firstString=“two”


现在有意义了吗?

firstString
不是引用,所以它会被复制。当您更改为引用时,编译器会抱怨需要是
常量字符串&
,并且不要让您更改第firstString=“2”行.
firstString
不是引用,所以它会被复制。当您更改为引用时,编译器会抱怨需要是
const string&
,并且不要让您在第firstString=“2”行中更改。