在学习C ++中的隐式复制构造函数时,我遇到了一种奇怪的行为。这是关于这一堆代码:
#include <iostream>
class Person
{
public:
char* name;
int age;
Person( const char* the_name, int the_age )
{
name = new char[strlen( the_name ) + 1];
strcpy( name, the_name );
age = the_age;
}
~Person()
{
delete[] name;
}
};
int main(){
Person p1( "Tom", 22 );
Person p2( p1 );
p2.name = "Bill";
// the output is: "Tom"
std::cout << p1.name << std::endl;
std::cin.get();
}
默认情况下,复制对象意味着复制其成员,因此在使用默认复制构造函数创建p2
对象时,它应仅复制指针name
,而不是它指向的字符数组。因此,更改对象name
的{{1}}成员应更改对象p2
的{{1}}成员。因此,name
应为p1
而不是p1.name
。
我的推理出了什么问题?为什么打印"Bill"
?
答案 0 :(得分:2)
默认情况下,复制对象意味着复制其成员
是
因此,在使用默认复制构造函数创建
p2
对象时,它应仅复制指针name
,而不是它指向的字符数组。
正确。
因此,更改对象
p2
的名称成员应更改对象p1
的名称成员。
不。是的,p2.name
和p1.name
指向相同的内存位置,但这并不意味着更改p1.name
的指针值将更改{的值{1}}。如果是p2.name
s,如果更改int
无效p1.name
,您会感到惊讶吗?因为这里是一回事。您有两个不同的变量,更改一个值不会改变另一个的值。
p2.name