class学习(二)拷贝构造函数,浅拷贝,深拷贝

1.拷贝构造函数书写:

Person(const Person &p)
{
    m_age=p.m_age;
    cout<<"Person拷贝构造函数调用"<<endl; 
}

2.拷贝构造函数调用时机:

                a.使用一个已经创建完毕的对象来初始化一个新对象        

Person p1(20);
Person p2(p1);

                b.值传递的方式给参数传值         

void test(Person p)      //注意改变p并不改变下面的p1
{
    p.m_age=20;
}
Person p1;
test(p1);

                c.值方式返回局部变量

Person work()
{
    Person p1;
    return p1;
}

3.构造函数调用规则:

        默认情况下,c++编译器会至少给一个类提供三个函数:

                        1.默认构造函数(无参,函数体为空)

                        2.默认析构函数(无参,函数体为空)

                        3.默认拷贝构造函数(值拷贝)

     如果用户定义有参构造函数,c++不再提供默认无参构造,但是会提供默认拷贝构造

     如果用户定义拷贝构造函数,c++不再提供其他构造函数

4.浅拷贝:“=”赋值均为浅拷贝,所以有指针时需要自己写拷贝构造函数

   深拷贝:                       

Person(int height)
{       
    m_height= new int(height); //new int(int x)返回一个指针,指向在堆区创建的一个新数据,该数据值为height
}
~Person()
{
    if(m_height!=NULL)
    {
        delete m_height; //因为在堆区开辟的数据系统不会自动释放,所以在不用后应该由程序员手段释放
        m_height=NULL;
    }
}
int *m_height; //定义一个指针类型,一会儿接受在堆区开辟的数据的地址,若浅拷贝则会导致堆区的内存重复释放,所以就要自己写拷贝函数,用深拷贝。

Person(const Person &p)
{
    m_height=new int (*p.m_height);
}

            ​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值