拷贝构造函数

编程爱好者联盟 2016-09-30

拷贝构造函数

拷贝构造函数就是以拷贝的方式来构造一个新对象的构造函数

class 类名{
    类名(const 类名& 对象引用){
        拷贝构造函数体
    }
}
  1. 当类中没有自定义拷贝构造函数时,系统会自动提供一个缺省拷贝构造函数,而缺省方式的拷贝构造函数就是按字节复制一份和拷贝源一模一样的副本
  2. 缺省方式的字节复制往往不能实现对象间的深拷贝,这时就需要自定义拷贝构造函数以获得真正意义上的副本;
  3. 拷贝构造调用的时机: 以一个存在的对象去创建另外一个不存在的对象

把一个对象传入一个非引用类型的值参数时

void test(A a){}

把一个对象作为函数的返回值的时候

A getA();
getA();
A b=getA();
//自定义拷贝构造
#include<iostream>
#include<cstring>
using namespace std;
class Student{
    char* m_name;
    int m_age;
    public:
        //实现有参的构造函数
        Student(const char* name,int age):m_name(NULL),m_age(age){
//          m_name=name;    //语法可以,但如果指向的被释放了,m_name就成了dangling pointer,高风险
            //申请一块动态内存给成员变量m_name;
            m_name=new char[strlen(name)+1];    //这才是好方法
            strcpy(m_name,name);
        }
        ~Student(){
            delete[] m_name;    //不是delete,是delete[]
            m_name=NULL;
        }
        //打印所有属性信息
        void show(void){
            cout<<"I am "<<m_name<<", "<<m_age<<"years old"<<endl;
        }
        //自定义拷贝函数实现深拷贝
        Student(const Student& rs):m_name(NULL),m_age(rs.m_age){
            m_name=new char[strlen(rs.m_name)+1];
            strcpy(m_name,rs.m_name);           //把原来的内容搬过来
        }
};
int main(){
    Student s("ZHANG Fei",30);
    s.show();
    Student s2(s);      //调用自定义拷贝实现深拷贝
    s2.show();
    return 0;
}//main()结束了会销毁对象,销毁之前会调用析构函数,有了自定义拷贝,就不用担心double free了

相关推荐