赋值运算符函数

C++ 拷贝构造函数和赋值运算符函数及其必要性和意义 本文前面主要介绍了拷贝构造函数和赋值运算符函数的区别,以及在什么时候调用拷贝构造函数、什么情况下调用赋值运算符函数。最后,分析了下深拷贝和浅拷贝的问题,即拷贝构造函数和赋值运算符函数的必要性和意义。本文综合了《C++ 拷贝构造函数和赋值运算符》和《拷贝构造函数和赋值函数的必要性和意义》的内容,并加上自己的理解。 C++ 拷贝构造函数和赋值运算符函数 本文主要介绍了拷贝构造函数和赋值运算符函 阅读详情

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

class CMyString
{
public:
	CMyString (char *pData=NULL);
	CMyString (const CMyString & str);
	CMyString & operator=(const CMyString &str) ;

	~CMyString(void);
private:
	char *m_pData;
};


------------------------------------------------------------

CMyString &CMyString::operator=(const CMyString &str) 
{
	if (this ==&str)
		return *this;
	delete []m_pData;
	m_pData=NULL;
	m_pData=new char [strlen(str.m_pData)+1];
	m_pData[strlen(str.m_pData)+1]='\0';
	strcpy(m_pData,str.m_pData);
	return *this;
}
------------------------------------------------------------------

CMyString & CMyString::operator=(const CMyString &str)
{
	if(this!=&str)
	{
		CMyString temp(str);
		char *ptem=temp.m_pData;
		temp.m_pData=m_pData;
		m_pData=ptem;
	}
	return *this;
	}
}
考虑到分配内存之前先用delete释放了实例m_pData的内存 如果此时内存不足将导致new char抛出异常 m_pData将是一个空指针 这样非常容易导致程序奔溃

要想在赋值运算符函数中实现异常安全性 一个简单的办法是可以先用new分配新的内容在用delete释放已有的内容 这样分配内容成功之后再释放原来的内容 也就是当分配内存失败时我们能确保实例不会被修改

更好的一个办法是先创建一个临时变量 再交换临时和原来的实例


函数中先创建一个临时实例temp 接着把temp.m_pData和实例自身的m_pData做交换 由于temp是一个局部变量 但程序运行到if的外面时就出了该变量的作用域 就会自动调用temp.m_pData指向的内存就是实例之前m_pData的内存 这就相当于自动调用析构函数释放实例的内存~~~


赋值运算符重载函数被继承了吗? C++语法规定赋值运算符重载函数不能被继承。关于这一点我的理解是赋值运算符和构造、析构函数一样,都是为类量身定做的,继承没有意义,所以编译器屏蔽了这个继承。     最近在网上看到一篇文章(http://blog.youkuaiyun.com/pbmichael/article/details/1608250),认为“‘赋值运算符重载函数’不是不能被派生类继承,而是被派生类的默认‘赋值运算符重载函数’给 阅读详情

相关推荐

【C/C++】拷贝构造函数 赋值运算符的重载

 1.拷贝构造函数 1.1拷贝构造函数基本形式 就类对象而言,相同类型的类对象是通过拷贝构造函数来在对象初始化期间完成整个复制过程的。 拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类T的拷贝构造函数的形式为T(const T& t)。 当用一个已初始化过了的自定义类类型对象去初始化另...

shimadear的博客 1454

拷贝赋值运算符处理自我赋值和异常安全检查

拷贝赋值运算符通常应该返回一个指向其左侧运算对象的引用。目的是为了实现连锁赋值操作;比如 x = y = z。其一般形式如下:class Foo { public: Foo& operator=(const Foo &rhs) //返回类型是个reference { ... return *this; //返回左侧对象 }

yang20141109的专栏 1373

类的函数成员(四):赋值函数

在某些情况下,缺省赋值函数对类与对象的安全性和处理的正确性还不够,这时就要求类的设计者提供自定义的赋值函数。: mov %rcx,0x10(%rbp) //将对象stu1的地址压入栈中: mov %rdx,0x18(%rbp)//将对象stu的地址压入栈中: mov 0x10(%rbp),%rax//从栈中取出对象stu1的地址,传送给rax= &stu)的实现: mov 0x18(%rbp),%rax//从栈中取出对象stu的地址,传送给rax。

shijiyingjie的博客 1346

异常安全的复制构造函数和拷贝赋值运算符函数

异常安全性问题 异常安全代码 在出现异常的情况下仍然能够正确运行 异常中立 将所有的异常都转发给调用者 永远不要在析构函数、重载运算符函数operator delete()或者operator delete[]中抛出异常 在编写析构函数和内存释放函数时,要假设存在throw()这样的异常规范 以template < typename T > class St

visionarywind的专栏 915

ENVI新手避坑指南:手把手教你搞定遥感影像的坐标系转换(附ArcGIS对比)

本文详细解析ENVI与ArcGIS在遥感影像坐标系转换中的关键差异与实战技巧,特别针对新手常见问题提供避坑指南。从基础概念到高级操作,涵盖定义投影、UTM转换等核心步骤,并对比两种软件的处理精度与效率,帮助用户高效完成遥感影像处理任务。

weixin_42531925的博客 379

Docker部署OnlyOffice踩坑实录:解决editor.bin下载失败的3种姿势

本文详细解析了Docker部署OnlyOffice时editor.bin下载失败的常见原因,并提供了三种核心解决方案。重点剖析了容器网络配置、Nginx反向代理(特别是proxy_pass设置)以及安全策略调整,帮助开发者彻底解决静态资源加载问题,确保文档协作平台稳定运行。

weixin_29281941的博客 873

赋值运算符函数异常安全

要想在赋值运算符函数中实现异常安全,我们有两种做法。         一 先用new分配新内容,再用delete删除已有的内容。这样只在分配内容成功后再释放原来的内容,也就是分配内存失败时,原来的实例不会被修改。         二 先创建一个临时实例,在交换临时实例和原来的实例交换。         CMyStrig &CMyString::operator=(const CMy

yun_weiguo的专栏 488

深度学习笔记(1)机器学习与深度学习基础

一些深度学习的简单概念和Transformer的学习。

hanliu2003的博客 1492

C++赋值运算符重载函数和拷贝构造函数

一、提供默认赋值运算符重载函数的时机 当程序没有显示地提供一个以本类或者本类的引用为参数的赋值运算符重载函数时,编译器会自动生成这样一个赋值运算符重载函数。#include <iostream> using namespace std;class Data { public: Data() {} Data(int _data) :data(_data) {

syeming的编程专栏 8749

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

Python与CAD系列基础篇(二)创建点和直线并修改样式

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。创建和编辑点和直线的方法,并演示如何修改它们的样式、颜色和线型。

weixin_43894929的博客 3036

C++:拷贝构造函数、赋值运算符重载

如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。这样写才是拷贝构造,通过同类型的对象初始化构造,而不是指针。这里可以完成拷贝,但是不是拷贝构造,只是⼀个普通的构造。也可以这样写,这里也是拷贝构造。

2401_86551514的博客 2817

最新Anaconda3的安装配置及使用教程(详细过程)

最新Anaconda3安装使用Anaconda下载方式一:官网下载方式二:清华镜像下载(推荐)Anaconda安装 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项 Anaconda + Jupyter 基本上已经是大部分机器学习/数据分析等开发者标配的开发环境, 不多介绍,直接进去正题: Anaconda下载 方式一:官网下载 下载地址传送门: 官网首页:https://www.anaconda.com/ 官网下载页:https://www

HowieXue 薛永浩的博客 34万+

拷贝构造函数与重载赋值运算符

拷贝构造函数应用的场景: 用一个对象初始化另外一个对象 函数的参数是一个对象,并且是值传递方式 函数的返回值是一个对象,并且是值传递方式 特别注意的是定义一个类时,会有默认拷贝构造函数(点击查看默认成员函数) 默认构造函数的本质 ...

BuXianShan的博客 4713

【宝藏级】全网最全的Pandas详细教程(2万字总结)

【回炉重造】Python之Pandas详细教程前言为什么要学习pandas?什么是Pandas?官网1. Pandas的索引操作索引对象Index {#索引对象index}1. Series和DataFrame中的索引都是Index对象2. 索引对象不可变,保证了数据的安全常见的Index种类Series索引 {#series索引}1. index 指定行索引名2. 行索引3. 切片索引4. 不连续索引5. 布尔索引DataFrame索引1. columns 指定列索引名2. 列索引3. 不连续索引高级索引

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 6万+

从 SEGW 到 SADL 的那根线,彻底理解 OData Data Source Mapping

本文摘要(150字): 在SAP Gateway的SADL型OData服务开发中,"Map to Data Source"是关键配置环节。与传统RFC映射不同,SADL映射不是针对单个CRUDQ操作,而是建立OData模型与SADL业务实体间的完整语义对应关系。通过属性映射和关联映射,系统能自动处理数据获取和导航请求。映射编辑器支持三种模式:属性映射处理字段对应,关联映射处理模型间关系,动作映射处理业务操作。映射的本质是建立语义翻译表,决定了后续OData请求如何转化为后端业务实体访问,而非简单的字段重命名

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

C++赋值运算符重载为何不能重载为友元函数,为何不能被继承

C++赋值运算符重载为何不能重载为友元函数,为何不能被继承

doubleintfloat的博客 994

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++学习之赋值运算符函数

什么时候赋值运算符符号被调用? 一个已经被初始化的实例从另一个实例中被赋予初值的时候,赋值运算符函数被调用(注意其和拷贝构造函数的区别) Test T1, T2; T2 = T1; //assignment operator called 什么时候我们应该写我们自己的赋值运算符函数? 一般来说,如果class中不包含指针,我们就没有必要单独写自己的赋值运算符函数,因为编译器会为每个cla...

Heart_M的博客 578

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++基础之赋值运算符函数(七)

当我们通过Computer类来创建两个对象com1和com2时当执行赋值时,将对象com2赋给com1时会自动调用赋值运算符函数,也可写成com1.operator(com2);这时com1._name和com2._name指向了同一块内存空间,当com1调用析构函数时就已经将那块堆空间销毁了,而com2调用析构函数时会继续释放那块堆空间,这就会导致一个双重释放(double free)的问题。首先在Computer类中_name我们申请了堆空间,如果直接_name=com._name;

qq_53243630的博客 460

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

1:赋值运算符函数

如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); CMyString& operator = (const CMyString& str); void Print(); private:

qq_41078889的博客 262

复制构造函数与赋值运算符

<br />复制构造函数与赋值运算符<br /><br />现在通过一个例子来说明复制构造函数与赋值运算符的区别: #include <iostream.h><br />#include<string.h><br />class String<br />{<br />private:<br />    char *data;<br />public:<br />    String(char *data1)<br />    {<br />        data=new char[10];<br /> 

编程学习之路 1370

C++之类和对象--赋值运算符重载和const成员函数

主要讲解赋值运算符,const成员函数和取地址以及const取地址

2301_80157147的博客 3027
上一篇: 快速找出故障机器
下一篇: 二维数组中的查找
Fivesplus
博客等级 码龄12年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值