深拷贝和浅拷贝

浅拷贝: 其实大家可以理解为浅拷贝是一个高级的赝品。华强北都听说过吧,无论华强北生产手机的外形,ui做的如何像iphone,可是它终究不是iphone。浅拷贝还有另外一个名字,叫做等位拷贝。还是以手机为例吧,你iphone颜值高,我一摸一样的复制你,你iphone有传感器,我也复制过来,总之,你iphone有啥,我就有啥。

那为什么华强北生产出来的iphone不叫iphone呢?因为操作系统不一样,cpu也不一样,浅拷贝只是1:1对等的拷贝了表面上的东西,但是“内涵”它却没拷贝

如果你自己没有提供一个拷贝构造器的话,系统会自动帮你生成一个默认的构造器,系统默认提供的构造器就是一个浅拷贝。

浅拷贝

#include <iostream>

class Girl
{
public:
    Girl(int age)
    :age(age)
    {
        std::cout<<"构造器"<<std::endl;
    };
    ~Girl(){
        std::cout<<"析构造"<<std::endl;
    };
    // Girl(const Girl& another){
 //       std::cout<<"拷贝构造"<<std::endl;
    // }
    int getAge(){
        return age;
    }
private:
    int age;

};
int main(int argc, char const *argv[])
{
    Girl girl(18);
    Girl girl2(girl); //发生了拷贝构造
    std::cout<<"&gilr:"<<&girl<<" girl age:"<<girl.getAge()<<std::endl;
    std::cout<<"&gilr2:"<<&girl2<<" girl2 age:"<<girl2.getAge()<<std::endl;
    return 0;
}
构造器
&gilr:0x7ffeea794e28 girl age:18
&gilr2:0x7ffeea794e20 girl2 age:18
析构造
析构造

浅拷贝的后遗症

#include <iostream>

class Girl
{
public:
    // Girl(int age,const char* s)
    // :age(age)
    // {
    //     name = new char[20];//申请了20个字节的空间
    //     strcpy(name,s);
    //     std::cout<<"构造器"<<std::endl;
    // };
    Girl(const char* s)
    {
        name = new char[20];//申请了20个字节的空间
        strcpy(name,s);
        std::cout<<"构造器"<<std::endl;
    };
    ~Girl(){
        if (name) {
            delete name;
            name = NULL;
        }
        std::cout<<"析构器"<<std::endl;
    };
    // Girl(const Girl& another){
 //       std::cout<<"拷贝构造"<<std::endl;
    // }
    int getAge(){
        return age;
    }
private:
    int age;
    char *name;

};
int main(int argc, char const *argv[])
{
    Girl girl("Mary");
    Girl girl2(girl);
    return 0;
}

上述代码编译虽可以通过,但是运行时报错了,原因是进行了2次析构

a.out(88771,0x110fe0d40) malloc: *** error for object 0x7fb20ac025b0: pointer being freed was not allocated
a.out(88771,0x110fe0d40) malloc: *** set a breakpoint in malloc_error_break to debug
`

深拷贝

#include <iostream>

class Girl
{
public:
    // Girl(int age,const char* s)
    // :age(age)
    // {
    //     name = new char[20];//申请了20个字节的空间
    //     strcpy(name,s);
    //     std::cout<<"构造器"<<std::endl;
    // };
    Girl(const char* s)
    {
        name = new char[20];//申请了20个字节的空间
        strcpy(name,s);
        std::cout<<"构造器"<<std::endl;
    };
    ~Girl(){
        if (name) {
            delete this->name;
            name = NULL;
        }
        std::cout<<"析构器"<<std::endl;
    };
    Girl(const Girl& another){
        if (name)
            delete name;
        name = new char[20];
        strcpy(name,another.name);
       std::cout<<"拷贝构造"<<std::endl;
    }
    int getAge(){
        return age;
    }
private:
    int age;
    char *name;

};
int main(int argc, char const *argv[])
{
    Girl girl("Mary");
    Girl girl2(girl);
    return 0;
}
构造器
拷贝构造
析构器
析构器

results matching ""

    No results matching ""