重载赋值运算符(c/c++)

最近为了准备面试,开始看《剑指Offer》这本书。的确是受到了很多启发,不管是面试技巧还是算法上。在这里记录下受到的启发和意识到的错误。
这里记录下书中提到的第一道题,我自己编写的程序,如果有什么不对的地方,各位不吝赐教。
题目是:请为CMyString该类型(有成员变量char* p_data)添加赋值运算符函数。(如果想知道完整的题目,请自行百度)。我贴出自己的代码,然后就我编写中遇到的困难做一说明。

代码如下:
CMyString.h文件

 class CMyString  
{
public:
    CMyString();
    CMyString(const CMyString& str);
    virtual ~CMyString();

    CMyString& operator=(const CMyString& old);

public:
    char* p_data;

};

MyString.cpp文件

#include "MyString.h"

CMyString::CMyString()
{
    p_data = new char[10];

}


CMyString::CMyString(const CMyString& str){
    this->p_data = str.p_data;
}

CMyString::~CMyString()
{
    if(p_data != NULL){
        delete[] p_data;
        p_data = NULL;
    }else{
        cout << "~~~~~ " << endl;
    }

}

CMyString& CMyString::operator=(const CMyString& old){


    if (this == &old)
    {
        return *this;
    }

    delete []p_data;
    p_data = NULL;

    p_data = new char[strlen(old.p_data)+1];
    strcpy(p_data, old.p_data);

    return *this;

    /*if(this != &old){
        CMyString strTemp(old);

        char* tmp = strTemp.p_data;
        strTemp.p_data = p_data;
        p_data = tmp;
    }

    return *this;*/

}

main

void main(){
    CMyString mystring1, mystring2;
    //mystring1.p_data = "wang";
    //mystring2.p_data = "zhou";
    strcpy(mystring1.p_data, "wang");
    strcpy(mystring2.p_data, "zhou");

    mystring1 = mystring2;

    cout << mystring1.p_data << "   " << mystring2.p_data << endl;
}

一开始的时候程序一直运行不了,因为用的是main函数里注释掉的那两行赋值语句,后来用了strcpy函数就可以运行了。因为如果用赋值,把p_data指向字符常量,那么重载赋值操作的时候,先delete[] p_data就会有内存错误。而且,由于在构造函数里给p_data分配了空间,并没有给它赋值,在析构的时候也不会释放内存,会导致内存泄露。
而strcpy函数,把构造函数分配的空间赋值了“wang”,这样在重载赋值操作符的delete语句便不再有问题。因此可以正常运行。
c++的内存真是一门学问,借此记录下曾经犯过的错误,希望以后不会再犯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值