声明一个字符串类,为这个类型添加赋值运算符

class MyString
{
public://构造函数MyString(char* pData = NULL);//构造函数MyString(const MyString& str);//析构函数~MyString(void);//赋值运算符MyString& operator=(const MyString& str);private:char* m_pData;
};

该字符串类中只有两个构造函数,一个析构,一个赋值运算符的重载,着重来说赋值运算符的重载,重载之前将构造函数和析构函数实现了

MyString::MyString(char *pData)
{if(pData == NULL){m_pData = new char[1];m_pData[0] = '\0';}else{m_pData = new char[strlen(pData) + 1];strcpy(m_pData, pData);}
}MyString::MyString(const MyString &str)
{m_pData = new char[strlen(str.m_pData) + 1];strcpy(m_pData, str.m_pData);
}MyString::~MyString()
{delete[] m_pData;
}

关于赋值运算符的重载,上一张图

S1 = S2 ,S1传给第一个参数,S2传给第二个参数,赋值自然顺理成章,以下是代码:

MyString& MyString::operator=(const MyString& str)
{if (this != &str)   //如果相等,即就是给自身赋值,直接返回*this;{delete[]m_pData;  //释放原实例中 m_pData的内存m_pData = NULL;m_pData = new char[strlen(str.m_pData) + 1];strcpy(m_pData, str.m_pData);  //重新申请空间并完成拷贝}return *this;
}

但是,以上代码书上说,还存在安全问题,说是,上例的赋值运算重载中释放了原有的实例对象内存,而去重新申请了内存,但是,一旦申请内存失败,也就是说new char 抛出了异常,m_pData将是一个空指针,问题就是一大堆,怎么办呢?一种方法是:先new 一块新内存,在delete释放已有的内存,这样,只有在内存分配成功之后才会释放原有内容,分配失败,原来的实例也不会被修改;

MyString& MyString::operator=(const MyString& str)
{if (this != &str){char* tmp = new char[strlen(str.m_pData) + 1];if (tmp != nullptr){delete[]m_pData;m_pData = NULL;m_pData = tmp;strcpy(m_pData, str.m_pData);}}return *this;
}

还有更好的写法:

MyString& MyString::operator=(const MyString& str)
{if (this != &str){MyString tmp(str);swap(m_pData,tmp.m_pData);  //库中交换函数 swap();}return *this;
}

还有大神是这样写的;

String& operator=(String rhs) // 传值{swap(rhs);return *this;}

拙见,欢迎纠正;

good

转载于:https://www.cnblogs.com/melons/p/5791860.html

类中赋值运算符重载函数相关推荐

  1. C++:运算符重载与类的赋值运算符重载函数

    目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:=重载函数(赋值运算符重载) 1.自定义= ...

  2. 派生类的赋值运算符重载【C++继承】

    派生类的赋值符重载 情况分析 父类和子类都使用系统默认提供的赋值运算符重载 父类自实现赋值运算符重载,子类使用系统默认提供的赋值运算符重载. 父类使用系统默认提供的赋值运算符重载,子类自实现赋值运算符 ...

  3. 一文说尽C++赋值运算符重载函数(operator=)

    http://www.cnblogs.com/zpcdbky/p/5027481.html 在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是, ...

  4. c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...

    一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...

  5. C++:类中的赋值函数

    先来看一个例子: 1 #include<iostream>2 #include<string>3 using namespace std;4 class Student{5 p ...

  6. c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

    一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...

  7. C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝

    C++类的赋值运算符"="重载,以及深拷贝和浅拷贝 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同时马上进行初始化操作,则称之为拷贝运算.例如: ...

  8. C++ ——赋值运算符重载函数

    文章目录 前言 一.赋值运算符重载函数是什么? 二.细谈赋值运算符重载函数 2.1 参数列表 2.2 返回值 2.3调用时机 二.赋值运算符重载函数练习 前言 在介绍赋值运算符重载之前,我们先看一段代 ...

  9. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

最新文章

  1. Jmeter-jtl性能测试报告转换-2种导出方法
  2. 彻底的卸载SQL Server2005
  3. leetcode第72题:编辑距离
  4. 之全能忙内_全能水适能指导员流行到山西,你是否跟上?
  5. 菜鸟技术专家胡斌:技术架构的战略和战术原则
  6. 卷积神经网络流程图_基于卷积神经网络的叶片气孔自动计数方法
  7. 但是在公司开空调睡觉还是冷
  8. python 时分秒相加大于24h_在python中,将24小时加到负时间差上
  9. A*算法之野人传教士问题 python解法
  10. Google地图 Google Places API中附近搜索,文本搜索,地址搜索,地点详情的简单介绍
  11. k8s教程----零基础快速入门
  12. jQuery源码分析-10事件处理-Event-事件绑定与删除-bind/unbind+live/die+delegat/unde
  13. java程序如何解代数方程_基于代数方程库Algebra.js解二元一次方程功能示例
  14. css锚点定位不准确问题
  15. java and运算_JAVA中逻辑运算符“|”和“”与“||”和“”的用法
  16. 给在读研究生+未来要读研同学们的一封受益匪浅的信
  17. Python:蜂巢(曼哈顿距离)
  18. 控制与决策latex排版解答
  19. 删除指定位置的元素(数组)
  20. PHP 验证码图片无法正常显示

热门文章

  1. 疯狂ios讲义疯狂连载之日期选择器(UIDatePicker)
  2. 判断触发器正在处理的是插入,删除还是更新触发
  3. WebSocket FlashSocket
  4. 微软Workflow Foundation 高阶透视
  5. what do eco consulting do
  6. challenging and foundational
  7. 大学的很重要的元素是圈子,是人气
  8. C# lambda表达式及初始化器
  9. 具有只读属性的ComboBox
  10. Redis过期策略及实现原理