#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.
請按任意鍵繼續…