拷貝構造函數與賦值運算符的重載函數

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章