C++面向对象入门(九)深拷贝构造函数和浅拷贝构造函数

浅拷贝构造函数和深拷贝构造函数 

浅拷贝构造函数

简单的将类中的成员进行值复制, 当类的中的某个成员是指针类型时, 复制的是指针指向的地址, 即两个对象指向的是堆上的同一块内存

深拷贝构造函数

用户(程序员)通过自己义拷贝构造函数使得在进行对象拷贝时, 对指针类型的成员, 在堆上重新开辟内存, 复制的是指针指向的内存地址存储的数据, 而不是地址, 即拷贝后两个对象的指针类型的成员指向的堆上两块地址不同的内存, 但是这两块内存所存储的数据是一样的
问: 为什么需要重新定义浅拷贝构造函数?
答: 当类对象的成员包含指针类型变量时, 需要在使用时手动申请堆上的内存空间, 而堆上的内存空间的释放由程序员来管理, 故常需要在析构函数中来释放内存,
delete关键字是通过指针指向的地址来释放内存的, 如果使用浅拷贝构造函数, 会导致同一块内存被释放多次, 就会产生异常. 故需要在拷贝时为新对象的该指针类型的成员变量重新申请内存, 而不是让两个对象的该指针类型的成员变量共用同一块内存.

#include <iostream>
#include <string>

using namespace std;

/**
 * 浅拷贝构造函数和深拷贝构造函数
 * 浅拷贝构造函数:简单的将类中的成员进行值复制, 当类的中的某个成员是指针类型时, 复制的是指针指向的地址, 即两个对象指向的是堆上的同一块内存
 * 深拷贝构造函数:用户(程序员)通过自己定义拷贝构造函数使得在进行对象拷贝时, 对指针类型的成员, 在堆上重新开辟内存, 复制的是指针指向的内存地址存储的数据, 而不是地址,
 * 即拷贝后两个对象的指针类型的成员指向的堆上两块地址不同的内存, 但是这两块内存所存储的数据是一样的
 * 问: 为什么需要重新定义浅拷贝构造函数?
 * 答: 当类对象的成员包含指针类型变量时, 需要在使用时手动申请堆上的内存空间, 而堆上的内存空间的释放由程序员来管理, 故常需要在析构函数中来释放内存,
 * delete关键字是通过指针指向的地址来释放内存的, 如果使用浅拷贝构造函数, 会导致同一块内存被释放多次, 就会产生异常. 故需要在拷贝时,
 * 为新对象的该指针类型的成员变量重新申请内存, 而不是让两个对象的该指针类型的成员变量共用同一块内存.
 */
class Rider {
public:
    Rider() {

    }

    Rider(string name) {
        this->name = name;
        cout << "Rider类构造函数调用" << endl;
    }

    Rider(string name, string status) {
        this->name = name;
        this->status = new string;
        *this->status = status;
        cout << "Rider类构造函数调用" << endl;
    }

    /**
     * 自定义深拷贝函数
     * @param r 欲拷贝的对象
     */
    Rider(const Rider &r) {
        this->name = r.name;
        this->status = new string ;
        *this->status = *r.status;
    }

    ~Rider() {

        cout << "The Rider's name is " << name << endl;
        cout << "The Rider's status is " << *status << endl;
        cout << "Rider类析构函数调用" << endl;
        if (status != NULL) {
            delete status;
            status = NULL;
        }
    }

private:
    string *status;
    string name;
};

void test1() {
    Rider zeroOneRH("Zero One");
    Rider zeroOneBS(zeroOneRH);
}

void test2() {
    Rider zeroOneRH("Zero One", "Rising Hopper");
    Rider zeroOneBS(zeroOneRH);
    int a = 10;
}

int main() {
//    test1();
    test2();
    system("pause");

    return 0;
}

 

posted @ 2020-08-19 12:04  DNoSay  阅读(188)  评论(0)    收藏  举报