我想知道为什么下面的代码是这样的:我在一个类中有char*
个成员字段。当我创建此类的一个对象然后创建第二个对象,然后将第二个对象分配给第一个对象时,第一个对象中char*
类成员的更改应该影响第二个对象的更改。为什么值不同?
class A{
public:
char* word;
int* number;
A(){
word = new char[100];
number = new int;
}
};
int main()
{
char* a = "lala";
char* b = "baba";
A a1;
a1.word = a;
*(a1.number) = 23;
A a2;
a2 = a1; //After that pointers should point to the same address, because a2.word = a1.word
a2.word = b;
*(a2.number) = 10;
cout << a1.word << endl << a2.word << endl;
cout << *(a1.number) << endl << *(a2.number) << endl;
return 0;
}
指针理论表明结果应该是:
Sample2
Sample2
10
10
但结果是:
Sample1
Sample2
10
10
对于作为班级成员的int*
,行为就像理论所暗示的那样。
答案 0 :(得分:3)
首次分配a2 = a1
时,两个指针都指向同一个字符串(sample1)
但是在执行a2.word = sample2
之后,您正在更改其中一个指针,但不会更改其他指针。
如果复制字符串而不是指定指针,则会得到预期的结果:
std::strcpy(a2.word, sample2);
这也会改变sample1
,因为那是a1.word
和a2.word
指向的地方。所以它相当于
std::strcpy(sample1, sample2);
答案 1 :(得分:1)
您没有更改指向的值。你正在改变指针。
答案 2 :(得分:1)
您的两个实例a1
和a2
未被指针引用。
因此,a2 = a1;
会创建a1
的副本,并将其分配给a2
- &gt;它们不是指同一个对象。
因此,当您执行a2.word = sample2;
时,仅更改word
对象中a2
的指针,如前所述与a1
不同1}}对象
答案 3 :(得分:1)
一步一步:
A a1;
a1.word = sample1;
a1.word
现在指向sample1
A a2;
a2 = a1; //After that pointers should point to the same address, because a2.word = a1.word
您的评论是正确的,a2.word
现在指向sample1
a2.word = sample2;
现在a2.word
指向sample2
。上述分配不会将sample2
复制到sample1
上,而是a2.word
指向sample2
。