C ++中

时间:2018-01-06 19:52:33

标签: c++ object constructor copy implicit

在学习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"

1 个答案:

答案 0 :(得分:2)

  

默认情况下,复制对象意味着复制其成员

  

因此,在使用默认复制构造函数创建p2对象时,它应仅复制指针name,而不是它指向的字符数组。

正确。

  

因此,更改对象p2的名称成员应更改对象p1的名称成员。

不。是的,p2.namep1.name指向相同的内存位置,但这并不意味着更改p1.name的指针将更改{的值{1}}。如果是p2.name s,如果更改int无效p1.name,您会感到惊讶吗?因为这里是一回事。您有两个不同的变量,更改一个值不会改变另一个的值。

p2.name