是C++;与Java字符串不同,字符串是可变的? 在C++中操作字符串是否正确:< /P> string s = "Sting"; s[2] = 'a';

是C++;与Java字符串不同,字符串是可变的? 在C++中操作字符串是否正确:< /P> string s = "Sting"; s[2] = 'a';,c++,string,C++,String,它工作正常(并打印“Sting”),但这样做安全吗 如果是,这是否意味着它们是可变的?是和是 这就像在位置2修改数组一样 是的,它是完全安全的,是的字符串是可变的,这意味着您可以更改它们,向它们添加新内容,还可以删除其中的部分 字符串文本本身是不可变的,就像在Java中一样。 字符串文本存储在内存的只读部分 例如,如果您执行以下操作,您将获得segfault: char *ptr = (char *) "hello"; ptr[0] = 'a'; //segfault! you can't c

它工作正常(并打印“Sting”),但这样做安全吗

如果是,这是否意味着它们是可变的?

是和是


这就像在位置2修改数组一样

是的,它是完全安全的,是的字符串是可变的,这意味着您可以更改它们,向它们添加新内容,还可以删除其中的部分

字符串文本本身是不可变的,就像在Java中一样。

字符串文本存储在内存的只读部分

例如,如果您执行以下操作,您将获得segfault:

char *ptr = (char *) "hello";
ptr[0] = 'a';  //segfault! you can't change something that's immutable
然而!您可以使用
s[2]='a'
修改字符串,除非使用const关键字声明该字符串

原因是字符串的
=
运算符重载,将字符串文本作为参数,然后循环字符串文本,将每个字符复制到可变字符数组中

因此,如果您比较Java和C中的字符串文字,它们在不可变时具有相同的行为。Java和C中的字符串对象在可变时也有相同的行为

下面的示例显示了字符串具有副本的事实:

#include <iostream>
#include <string>

using namespace std;

int main()
{
  const char *ptr = "hello";
  string s = ptr;

  s[0] = 'b';

  cout << s << endl; //prints bello
  cout << ptr << endl; //prints hello

  return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
const char*ptr=“你好”;
字符串s=ptr;
s[0]=“b”;

C++P>字符串在C++中是可变的,但是如果有很大的能力,则会有很大的责任:如果你从字符串内存中读取或存储到超出界限的地方,你会得到不确定的行为。例如,在你的例子中,如果你提到S[ 12 ],你会得到未定义的行为。

< P> C++ >代码> STD::String 是可变的,并且通常是指派的。复制字符串数据。Java
string
是不可变的,赋值将复制对该字符串的引用


类型
std::shared\u ptr
在某种程度上类似于Java字符串。然而,它是穷人的替代品。在C++03中,它与优化相关,例如字符串集合的排序,但在C++11移动语义中,它不再与任何东西相关——除了学术POV之外。

C++字符串文本,即。,类似于
“literal”
的内容是不可变的,尽管C++03允许将指向此类文字的指针分配给
字符*
(此权限已被C++11弃用并删除)。尝试更改字符串文字的字符是未定义的行为:

char* s = "literal"; // OK with C++03; illegal with C++11 and later
s[0] = 'x';          // undefined behavior

C++ >代码> STD::String 对象肯定是可变的,假设它们没有声明为“代码> STD::String const 。如果考虑到代码< char < /Code >对象的相互独立,可以对单个对象赋值。但是,实际上,字符串包含UTF-8编码为UTF-8B是很常见的。如果是这种情况,更改字符串的任何元素都可能破坏正确的编码,例如,因为延续字节被其他字节替换


是的,字符串是可变的,但从语义的角度来看,它可能不安全,以分配给各个元素。<代码> > STD::String S是可变的。但是字符串文字不是。这很可能是C++字符串。但是,你应该明确你的意思。注意:代码> char *s=“内容”。在C++中,被禁止,它应该是不变的<代码> const char s=“内容”< /> >。假设在示例中的字符串是STD::string,是STD::String和CARS s[]=“内容”数组(与上面的char */const char不同)是可变的。@T.C:你说的字符串文字是什么意思,伙计?我认为双引号中的任何东西都是字符串文字,正如问题中的示例所示,它是可变的。否。上面的示例在堆栈上创建了一个字符串对象并初始化了内存。它拥有“Sting”C++完全不是java的。请得到一本好C++书,读它。你会很高兴你做的。请解释你所说的字符串文字不是不可变的。我是说,任何一个字符串文字中的双引号,对吗?在我提供的例子中,我们做了变异。请解释兄弟。双引号中的任何东西都是字符串Li。teral。该字符串存储在内存的只读部分。因此它是不可变的,因为您无法写入该内存。在您提供的示例中,您没有对字符串文本进行变异。您对存储在string对象中的字符串文本进行了变异。我将键入一个示例,使这个概念非常清晰。@AnonymousAndy-第一个l在您的示例中,ine采用字符串文字,并从文字创建一个std::string

对象
。它在概念上与您执行的
int a=1;
操作没有区别;
您可以更改
a
的值,对吗?但您不能更改
1