C++复制构造函数

复制构造函数的定义

复制(拷贝)构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。

#include<iostream>
using namespace std;

class zywscq
{
public:
    zywscq(int aa):a(aa){}
    zywscq(const zywscq &C):a(C.a){}
    void putval();
private:
    int a;
};

void zywscq::putval()
{
    cout<<a<<endl;
}

int main()
{
    zywscq A(5);
    zywscq B=A;
    B.putval();
    return 0;
}

这段代码如果没有写复制构造函数也没有关系,因为系统默认的复制构造函数就是把每个值对应的复制过去。程序中没有声明,编译器就自动生成一个默认的复制构造函数。

如果不希望对象被默认的复制构造:

C++98做法:将复制构造函数声明为private,并且不提供函数的实现。

C++11做法:用“=delete”指示编译器不生成默认复制构造函数。

比如这样:zywscq(const zywscq& p) =delete;  //指示编译器不生成默认复制构造函数

调用复制构造函数的三种情况:

1.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;

2.如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;

3.如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。

深层复制与浅层复制(深拷贝与浅拷贝)

浅层复制:就是对象数据的一一复制。

深层复制:当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制。

//浅层复制
#include<iostream>
using namespace std;

class zywscq
{
public:
    zywscq(int aa)
    {
        a=aa;
        p=new int(100);
    }
    void putval();
    ~zywscq()
    {
        if(p!=NULL)
            delete p;
    }
private:
    int a;
    int *p;
};

void zywscq::putval()
{
    cout<<*p<<endl;
}

int main()
{
    zywscq A(5);
    zywscq B=A;
    A.~zywscq();
    B.putval();
    return 0;
}

这是浅层复制,两个类里的指针指向的是同一个内存地址,这样很不好,一个类A销毁后,另一个类B的p指针就成了野指针,输出了不可预料的结果。

//深层复制
#include<iostream>
using namespace std;

class zywscq
{
public:
    zywscq(int aa)
    {
        a=aa;
        p=new int(100);
    }
    zywscq(const zywscq &C)
    {
        a=C.a;
        p=new int;
        *p=*(C.p);
    }
    void putval();
    ~zywscq()
    {
        if(p!=NULL)
            delete p;
    }
private:
    int a;
    int *p;
};

void zywscq::putval()
{
    cout<<*p<<endl;
}

int main()
{
    zywscq A(5);
    zywscq B=A;
    A.~zywscq();
    B.putval();
    return 0;
}

这是深层复制,结果是100,符合预期。

原文地址:https://www.cnblogs.com/zywscq/p/4943706.html