拷贝构造函数与赋值运算符的重载函数

#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<stdlib.h>
#include<string.h>
using namespace std;
#include<iostream>
#include<vld.h>

class CGoods
{
public:
    CGoods(char *pname,int amount,double price);
    ~CGoods();
    CGoods(const CGoods &src)//拷贝构造函数
    {
        cout << "CGoods(const CGoods &src)" << endl;
        _pname = new char[strlen(src._pname) + 1];
        strcpy(_pname,src._pname);
        _amount = src._amount;
        _price = src._price;
    }
    void operator=(const CGoods &src)
    {
        if (this == &src)//防止自赋值
        {
            return;
        }
        delete[]_pname;
        _pname = new char[strlen(src._pname) + 1];
        strcpy(_pname,src._pname);
        _amount = src._amount;
        _price = src._price;
    }

    void show()
    {
        cout << "名称:" << _pname << endl;
        cout << "数量:" << _amount << endl;
        cout << "单价:" << _price<< endl;
    }
    CGoods& get_value(CGoods&src);
private:
    char *_pname;
    int _amount;
    double _price;
};

CGoods::CGoods(char *pname, int amount, double price)
{
    cout << "CGoods(char *pname,int amount,double price)" << endl;
    _pname = new char[strlen(pname)+1];
    strcpy(_pname,pname);
    _amount = amount;
    _price = price;
}

CGoods::~CGoods()
{
    cout << "~CGoods()" << endl;
    delete[]_pname;
    _pname = NULL;
}

int main()
{

    CGoods good1("腾飞讯",10,11);//1 /*此语句编译器先开辟内存并且用this指针\
    指向这块内存,然后编译器会调用带参数为char*, intdouble类型的构造函数,将这些值初始化给这个对象*/
    CGoods good2 = CGoods("百度", 2, 20.0);/*此语句本应该先产生临时对象,临时对象调用拷贝构造函数,生成good2,遇到分号后临时对象生命
    周期结束,调用析构函数释放临时对象占用的空间,但是编译器会优化,直接优化成上述1式形式,就不产生临时变量,直接在this指针指向的内存空间中
    将这些值初始化进去*/
    cout << "---------------------------------------------------------------------------" << endl;
    CGoods good3 =good2;
    CGoods good4(good2);//此句和上式一样,都是调用自定义拷贝构造函数(如果没有自定义此函数,系统默认产生,但是会发生浅拷贝现象(把good2._pname指向的堆空间释放两次而导致崩溃))\
    构造新对象
    cout << "---------------------------------------------------------------------------" << endl;
    good2 = CGoods("阿里巴巴",3,30);//这句先调用构造函数创建临时对象,再调用自定义的赋值运算符的重载函数(如果非自定义的赋值函数,good2的堆空间将泄漏,而临时对象的堆空间释放两次导致崩溃)\
    把临时对象赋值给good2,语句结束调用析构函数释放临时对象

    return 0;
}

结果:
Visual Leak Detector Version 2.4RC2 installed.
CGoods(char *pname,int amount,double price)

CGoods(char *pname,int amount,double price)

CGoods(const CGoods &src)

CGoods(const CGoods &src)

CGoods(char *pname,int amount,double price)
~CGoods()
~CGoods()
~CGoods()
~CGoods()
~CGoods()
No memory leaks detected.
Visual Leak Detector is now exiting.
请按任意键继续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值