C++ 拷贝构造(三)

来源:互联网 发布:淘宝圈椅三件套 编辑:程序博客网 时间:2024/06/16 06:50

如果一个类有指针,需要另外写拷贝构造函数。否则,就会形成浅拷贝,造成两个指针指向同一个内存,在析构的时候出错。

这里写图片描述

#include <iostream>#include<cstring>using namespace std;class Person{public:    Person(const char *s);    ~Person();    void print();    char *name;};Person::Person(const char *s){    name = new char[::strlen(s) + 1];    ::strcpy(name, s);}Person::~Person(){    delete[] name;//array delete}void Person::print(){    std::cout << name << std::endl;}void main(){    Person p1("John");    Person p2(p1);    p1.print();    p2.print();    printf("p1.name=%p\n", p1.name);//一样    printf("p2.name=%p\n", p2.name);//一样    return 0;}

也就是说,浅拷贝会将指定对象的成员变量复制到目标对象,对象当中的指针成员变量也是。这会造成一个问题,如果浅拷贝完成后释放指定对象的指针成员变量指向的堆内存区域,目标对象对此并不知情,如果它对这块内存进行操作,就会引发异常。
因此,需要定义一个自己的拷贝构造。
这里写图片描述

To Person declaration add copy ctor prototype:Person(const Person& w);    //copy ctorTo add copy ctor defintion:Person::Person(const Person& w){    name = new char[::strlen(w.name)+1];    ::strcpy(name,w.name);}

另外一种拷贝构造函数的调用时机是当声明一个类的对象并赋值时:

int main(){    A a;    A t = a;//注意,此时调用的是拷贝构造函数,深拷贝    A b;    b = a;//赋值操作,浅拷贝,除非在A类中重载“=”操作符    return 0;}
原创粉丝点击