面试题1:赋值运算符

请为下面的类类型添加赋值运算符函数

class CMyString
{
private:
	char* m_pData;
public:
	CMyString(char* pData = nullptr);
	CMyString(const CMyString& str);
	~CMyString();
	//CMyString & CMyString::operator=(const CMyString & str) 此处为后续加上的函数声明,下面的为函数实现。
};

解题思路

  • 1.返回引用以便连续赋值.ps:不加&也可以,只是按值传递效率比较低
    (如果不是返回引用,①在形参是引用的前提下,第二次赋值左右类型不一致,无法完成赋值;②在形参不是引用的前提下,则每次赋值时都会调用赋值构造函数,消耗大量的资源)
    补充两点:
    一、c/c++赋值运算符的本意为“返回左值的引用”(左值:赋值号左面的变量而非其值)
    对于a = b(a,b均为对象时),若不返回左值的引用,将会生成临时对象。如果不处理a = b = c这样的表达式,也会正常(只是会调用拷贝构造函数和析构函数处理临时对象)。
    二、为了进行连续赋值,即 x = y = z
    PS:也并非必须返回引用,返回引用的好处既可以于赋值的原始语义已知,又可避免拷贝构造函数和析构函数的调用

  • 2.传入常量引用:非引用的话,形参到实参会调用一次复制构造函数,产生无谓消耗(顶层const对拷贝无影响)

  • 3.释放实例自身已有的内存

  • 4.判断传入的参数和当前的实例(*this)是不是同一个实例。如果是,不进行赋值操作,否则释放内存的时候,传入参数的内存也被释放掉了(多个对象指向同一块儿内存,释放要小心!)

#include<cstring>
#include<cstdio>

class CMyString{
public:
    CMyString(char* pData = nullptr);
    CMyString(const CMyString& str);
    ~CMyString(void);

    CMyString& operator = (const CMyString& str);

    void Print();
      
private:
    char* m_pData;
};

CMyString::CMyString(char *pData)
{
    if(pData == nullptr)
    {
        m_pData = new char[1];
        m_pData[0] = '\0';
    }
    else
    {
        int length = strlen(pData);
        m_pData = new char[length + 1];
        strcpy(m_pData, pData);//字符串常量的本值就是第一个字符的地址,pDate就是代表字符串常量
    }
}

CMyString::CMyString(const CMyString &str)
{
    int length = strlen(str.m_pData);
    m_pData = new char[length + 1];
    strcpy(m_pData, str.m_pData);
}

CMyString::~CMyString()
{
    delete[] m_pData;
}

CMyString& CMyString::operator = (const CMyString& str)
{
    if(this == &str)
        return *this;

    delete []m_pData; //释放实例自生已有的内存
    m_pData = nullptr;  //防止m_pData成为野指针

    m_pData = new char[strlen(str.m_pData) + 1];//strlen()不统计最后的\0字符
    strcpy(m_pData, str.m_pData);

    return *this;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值