通过值或引用将字符串分配给另一个字符串?

时间:2018-09-16 00:43:17

标签: c++

我有以下代码:

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。

2 个答案:

答案 0 :(得分:2)

C ++中的对象通常具有值语义。

那是因为所有原始类型(例如intdoublechar等)都可以那样工作,而标准库中的类型(例如{{1 }},std::stringstd::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