zoukankan      html  css  js  c++  java
  • 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,符合预期。

  • 相关阅读:
    bzoj 4361: isn
    bzoj 2560: 串珠子
    bzoj 3622: 已经没有什么好害怕的了
    UOJ #30. 【CF Round #278】Tourists
    Codeforces Round #452 E. New Year and Old Subsequence
    bzoj 2653: middle
    codeforces701C
    codeforces437C
    codeforces518B
    codeforces706C
  • 原文地址:https://www.cnblogs.com/zywscq/p/4943706.html
Copyright © 2011-2022 走看看