类中赋值运算符重载函数
声明一个字符串类,为这个类型添加赋值运算符
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
类中赋值运算符重载函数相关推荐
- C++:运算符重载与类的赋值运算符重载函数
目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:=重载函数(赋值运算符重载) 1.自定义= ...
- 派生类的赋值运算符重载【C++继承】
派生类的赋值符重载 情况分析 父类和子类都使用系统默认提供的赋值运算符重载 父类自实现赋值运算符重载,子类使用系统默认提供的赋值运算符重载. 父类使用系统默认提供的赋值运算符重载,子类自实现赋值运算符 ...
- 一文说尽C++赋值运算符重载函数(operator=)
http://www.cnblogs.com/zpcdbky/p/5027481.html 在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是, ...
- c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...
一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...
- C++:类中的赋值函数
先来看一个例子: 1 #include<iostream>2 #include<string>3 using namespace std;4 class Student{5 p ...
- c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数
一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...
- C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝
C++类的赋值运算符"="重载,以及深拷贝和浅拷贝 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同时马上进行初始化操作,则称之为拷贝运算.例如: ...
- C++ ——赋值运算符重载函数
文章目录 前言 一.赋值运算符重载函数是什么? 二.细谈赋值运算符重载函数 2.1 参数列表 2.2 返回值 2.3调用时机 二.赋值运算符重载函数练习 前言 在介绍赋值运算符重载之前,我们先看一段代 ...
- 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况
在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...
最新文章
- Jmeter-jtl性能测试报告转换-2种导出方法
- 彻底的卸载SQL Server2005
- leetcode第72题:编辑距离
- 之全能忙内_全能水适能指导员流行到山西,你是否跟上?
- 菜鸟技术专家胡斌:技术架构的战略和战术原则
- 卷积神经网络流程图_基于卷积神经网络的叶片气孔自动计数方法
- 但是在公司开空调睡觉还是冷
- python 时分秒相加大于24h_在python中,将24小时加到负时间差上
- A*算法之野人传教士问题 python解法
- Google地图 Google Places API中附近搜索,文本搜索,地址搜索,地点详情的简单介绍
- k8s教程----零基础快速入门
- jQuery源码分析-10事件处理-Event-事件绑定与删除-bind/unbind+live/die+delegat/unde
- java程序如何解代数方程_基于代数方程库Algebra.js解二元一次方程功能示例
- css锚点定位不准确问题
- java and运算_JAVA中逻辑运算符“|”和“”与“||”和“”的用法
- 给在读研究生+未来要读研同学们的一封受益匪浅的信
- Python:蜂巢(曼哈顿距离)
- 控制与决策latex排版解答
- 删除指定位置的元素(数组)
- PHP 验证码图片无法正常显示