我有以下代码:
string line1;
string line2;
line1 = "this";
line2 = line1;
line1.replace(0, 1, "T");
cout << "line1: " << line1 << " line2: " << line2 << endl;
输出为:
line1: This line2: this
因此,看起来line1和line2没有指向同一字符串对象。
这让我感到困惑,因为我认为由于c ++字符串是可变的,因此更改s1也应该更改s2。
答案 0 :(得分:2)
C ++中的对象通常具有值语义。
那是因为所有原始类型(例如int
,double
,char
等)都可以那样工作,而标准库中的类型(例如{{1 }},std::string
,std::vector
等)是根据原始类型建模的。
因此:
std::map
表示您有两个完全独立的string line1;
string line2;
对象。它们不是引用或指针(例如在Java中),它们本身就是完整的对象。
然后
string
并不意味着line2 = line1;
指向与line2
相同的基础对象(这并不意味着因为line1
不是引用或指针);这意味着将line2
对象的内容复制到line1
对象中。 line2
以后对line1
所做的任何更改在line2
中都不可见,因为它是独立副本。
答案 1 :(得分:1)
它们是可变的,但是除非您声明它们为变量(并且都被声明为string
,而不是string&
,否则它们不是引用。)该行:
line2 = line1;
调用拷贝分配(如果您同时声明并初始化了它,那将是拷贝构造,但是在这种情况下没有有意义的区别),将line2
初始化为相同的 value < / em>为line1
,但从此以后完全独立于line1
。