zoukankan      html  css  js  c++  java
  • 赋值运算符函数

    • 题目描述:

    如下为类型CMyString的声明,请为该类型添加赋值运算符函数

    class CMyString{
    public:
    	CMyString(char* pData = NULL);
    	CMyString(const CMyString& str);
    	~CMyString(void);
    private:
    	char* m_pData;
    };
    
    • 分析:

       显然这道题考的是拷贝赋值运算符函数的定义,重点有几个:

      1. 拷贝赋值运算符函数的返回值类型是该类型的引用,并在函数结束前返回实例自身的引用(*this)。
      2. 拷贝赋值运算符函数传入的参数类型是该类型的常量引用
      3. 要释放实例原有的内存
      4. 要判断传入参数是否是当前实例本身,如果传入的是实力本身而又释放了实例的内存,就会导致严重错误。

      接下来就可以写这个函数了,有两种方法,方法一是我按照c++ primer中的方法写的,也就是先new分配一个新内容将原内容拷贝过去,再delete原内存。方法二是剑指offer上的,先创建一个临时的实例(类对象,用传入的参数初始化),然后交换临时实例和原实例(在函数结束后临时实例被释放)。

      • 方法一:
      CMyString& CMyString::operator==(const CMyString& str)
      { //成员char*是字符串数组,new和copy的方式很重要
      	char *newdata = new char[strlen(str) + 1];
      	strcpy(newdata,str.m_pData);
      	//新内存分配完成,再进行delete,这里先new后delete防止了内存不足报错而m_pDate已空的情况
      	delete []m_pData;
      	m_pDate = newdata;
      	return *this;
      }
      
      • 方法二:
      CMyString& CMyString::operator=(const CMyString& str)
      {
      	if(this != &str)
      	{
      		CMyString strTemp(str);
      		char* pTemp = strTemp.m_pData;
      		strTemp.m_pData = m_pData;
      		m_pData = pTemp;
      	}
      	return *this;
      }
      

      这一题考的是拷贝控制的内容,拷贝控制部分包括拷贝构造函数、拷贝赋值运算符、析构函数等等内容,有必要找时间进行总结。

  • 相关阅读:
    欧拉函数线性筛法
    欧拉筛素数
    05:登月计划
    09:LGTB 学分块
    2017.7.15清北夏令营精英班Day1解题报告
    T7316 yyy的最大公约数(者)
    T7314 yyy的巧克力(钟)
    T7315 yyy矩阵折叠(长)
    DataReader,DataTable利用泛型填充实体类
    数据库入库的方式实现
  • 原文地址:https://www.cnblogs.com/Bill-LHR/p/6757795.html
Copyright © 2011-2022 走看看