#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*, int,double类型的构造函数,将这些值初始化给这个对象*/
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.
请按任意键继续…