Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是c++;字符串类只读?_C++_String - Fatal编程技术网

C++ 是c++;字符串类只读?

C++ 是c++;字符串类只读?,c++,string,C++,String,与上面的代码一样,字符串的一部分已经更改,编译器会生成一个新字符串还是对旧字符串进行修改 您将修改现有的字符串测试[0]将返回对第一个字符的非常量引用(因为字符串对象是非常量),该引用将成功替换为b字符 根据运算符[]查看。,运算符[]将返回此索引处字符的引用 如果字符串对象是const限定的,则函数返回一个const char&。否则,它将返回一个char& 如果字符串为常量,则无法修改它,否则可以更改原始字符串否,您正在修改旧字符串。如果希望字符串对象为只读,则需要const std::st

与上面的代码一样,字符串的一部分已经更改,编译器会生成一个新字符串还是对旧字符串进行修改

您将修改现有的
字符串

测试[0]
将返回对第一个字符的非常量引用(因为字符串对象是非常量),该引用将成功替换为
b
字符

根据运算符[]查看。

,运算符[]将返回此索引处字符的引用

如果字符串对象是const限定的,则函数返回一个const char&。否则,它将返回一个char&


如果字符串为常量,则无法修改它,否则可以更改原始字符串

否,您正在修改旧字符串。如果希望字符串对象为只读,则需要const

std::string test("this is a test string");
test[0] = 'b';

string
的构造函数将复制字符数组。第二行将修改该副本

test
std::string
将变为“bhis是一个测试字符串”,因为您可以更改它。
用于构造字符串的字符串文本
“这是一个测试字符串”
不会更改。

C++
std
字符串是可更改的,并且可以更改。在这种情况下,字符串将进行修改,而不是实例化新的字符串对象。

实际上,构造函数无法复制任何字符串;它将将字符数组复制到新创建的字符串中。但是,无论如何,我都会更改文本。值得一提的是,将对象声明为
const
并不能使其成为您所说的真正只读对象,因为constness可以被丢弃。@Kolyunya但对其执行任何非const操作都是未定义的行为。@juanchopanza谢谢您提供的信息,我不知道<代码>7.1.5.1/4:除了任何声明为可变(7.1.1)的类成员都可以修改外,任何在常量对象的生存期(3.8)内修改常量对象的尝试都会导致未定义的行为。
@Kolyunya如果原始对象不是
常量
,则它不是UB。因此您可以使用
voidfoo(const&strings1)
字符串s;富(s)
然后在
foo
的内部执行
const\u cast
并调用非const方法。这会让人感到困惑和容易出错,但不是UB,因为
s
不是
const
。所以,也许你看到的一些黑客是“OK”的。@juanchopanza我现在明白了。。。谢谢你的解释。我记得的一个例子是类成员getter将常量引用返回给非常量成员。丢弃参考常数,并应用非常数运算。因此,这是完全合法的。
std::string const test("this is a test string");
test[0] = 'b'; // compile error.