了解返回字符串引用的函数中的"const"
Understanding the "const" in a function that returns a string reference
我有这个代码:
#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&
和firstString
为string&
类型,则将修改func()
内的字符串。
在本例中,const表示返回的引用不能用于修改字符串。您从来没有尝试过这样做,因为您将结果分配给了单独的对象字符串,而字符串与函数内部声明的静态字符串无关。
要查看正在播放的const,请按以下方式替换该行:std::string& firstString = func();
您将看到它不允许您编译程序(前提是您仍然有常量std::string&
作为func()
的返回值(。错误就在这一行。现在,将行更改为const std::string& firstString = func();
程序仍然无法编译,但现在在不同的行-firstString = "two";
现在有意义了吗?
相关文章:
- 从函数返回const char*数组
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 从类方法返回 "const char*" 作为 std::string&
- 为什么const rvalue合格的std ::可选:: value()返回const rvalue参考
- 通过移动分配从算术运算符过载中返回const值
- 从本机代码返回"const char*"并在java中获取"字符串"
- 为什么我的C 函数拒绝返回const引用
- 通过参考返回和const函数返回const值的函数之间的差异
- 如果我返回const定义的对象,为什么const关键字被取消资格
- 返回const lvalue引用rvalue临时?为什么这项工作
- 内置类型的返回const值
- 返回 const std::string*& from a std::string *tab[11]
- 如何在静态方法中返回const类型
- 返回const引用和非常数成员函数调用
- 为什么不允许我将函数返回 const char* 的结果分配给 char*,bt 可以将字符串文字(常量)分配给 cha
- 在 C++ 中返回 const 字符串引用的字符串文本
- 为什么我们必须从一元前缀运算符重载返回 const 引用
- 在返回 const 错误的函数中传递值
- 为什么我可以将返回 'const T&' 的函数的返回值分配给 'T' 变量,而不是 'T&' 变量?