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.