C++ Primer 5th笔记(chap 13 拷贝控制)拷贝赋值函数
1. 实现方式
通过拷贝赋值运算符operator =来实现,实际上是重载运算符(函数),其名字由关键字 operator 接表示要定义的运算符的符号组成。赋值运算符通常应该返回一个指向其左侧运算对象的引用。
eg.
class Foo{public:Foo& operatoe=(const Foo&);
}Sales_data & Sales_data::operator=(const Sales_data &rhs)
{bookNo = rhs.bookNo;units_sold = rhs.units_sold;revenue = rhs.revenue;return *this;
}
2. 功能
赋值运算符组合了析构函数和构造函数的操作:
- 类似析构函数,赋值操作会销毁左侧运算对象的值
- 类似拷贝构造函数,赋值操作会从右侧对象拷贝数据
class Hasptr{public:Hasptr(const std::string &s=std::string()):ps(new std::string(s)),i(0){}Hasptr(const Hasptr &p):ps(new std::string(*p.ps)),i(p.i){}Hasptr& operator=(const Hasptr&);~Hasptr(){delete ps;}
private:std::string *ps;int i;
}Hasptr& Hasptr::operator = (const Hasptr &rhs)
{auto newp = new string(*rhs.ps); //拷贝底层的stringdelete ps; //释放旧内存ps = newp; //右侧对象拷贝数据到本对象i = rhs.i;return *this; //返回本对象
}
3. 注意
如果将一个对象赋予自身,赋值运算符必须能正常工作。假如异常发生时,得有throw try(能将左侧运算对象置于一个有意义的状态)
//如果不检查自身赋值,试问如下代码将会发生什么?
Hasptr& Hasptr::operator = (const Hasptr &rhs)
{delete ps; //释放旧内存auto newp = new string(*rhs.ps); //拷贝底层的string i = rhs.i;return *this; //返回本对象
}
C++ Primer 5th笔记(chap 13 拷贝控制)拷贝赋值函数相关推荐
- c++ primer 5th,习题13.3 答案是不是错了?(未解决)
c++ primer 5th,习题13.3 答案是不是错了?如下: 这两个类都未定义拷贝构造函数,因此编译器为它们定义了合成的拷贝构造函数.合成的拷贝构造函数逐个拷贝非 const成员,对内置类型的成 ...
- 拷贝构造函数和赋值函数的一些知识
/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2. ...
- 构造函数、拷贝构造函数、赋值函数和析构函数
文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...
- 构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...
- C++——拷贝构造函数和赋值函数的注意点
每个类只有一个赋值函数,由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视. 1.如果不主动编写拷贝构造函数和赋值函数,编译器将以"位拷贝"的方式自动 ...
- 基础备忘:拷贝构造函数和赋值函数
3.1 拷贝构造函数概述 现在我们来学习一种特殊的构造函数--拷贝构造函数. 对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同 ...
- 拷贝构造函数和赋值函数(转)
标签: 无标签 原帖地址:http://www.programfan.com/blog/article.asp?id=10944 现在我们来学习一种特殊的构造函数--拷贝构造函数. 对于普通类型的对象 ...
- 拷贝构造函数和赋值函数
3.1 拷贝构造函数概述 现在我们来学习一种特殊的构造函数--拷贝构造函数. 对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同 ...
- C++ Primer 5th笔记(chap 13 拷贝控制)合成的移动操作
1. 出现条件 只有当一个类没有定义任何自己版本的拷贝控制成员,且类的每个非 static 数据成员都可以移动,编译器才会为它合成构造函数或移动赋值运算符. struc X{int i;std::st ...
- C++ Primer 5th笔记(chap 13 拷贝控制)三五法则
1. 三个基本操作可以控制类的拷贝操作 • 拷贝构造函数 • 拷贝赋值运算符 • 析构函数. 新标准还有2个函数: • 移动构造函数(move constructor) • 移动赋值运算符(move- ...
最新文章
- 王者荣耀活动精选 Blink 第三弹来袭!
- Java学习_day005:循环结构
- 数据库集群技术 -摘自网络
- 2020年高等数学方法与提高(上海理工大学)学习笔记:一元函数微分学
- android 源码各版本下载 原生纯净版
- HTML基础-张晨光-专题视频课程
- execve系统调用_张凯捷—系统调用分析(3) (基于最新Linux5.0版本系统调用日志收集系统)...
- Java LocalDate类| 带示例的getDayOfYear()方法
- 金兄的境界:我的名字搜索终于出来了。重要信息声明,并永久置顶。我的博客在零网zeronet...
- php通过函数怎么禁止百度蜘蛛抓取,怎么屏蔽百度蜘蛛抓取网站?
- 如果一个人不喜欢争,不喜欢计较,只知道退让,是不是真的傻?
- 1.1 线性模型基础
- 自适应的设置字体的方式
- 【python路上小记】匹配11位电话正则表达式
- 怒了,以后有文件保存到网上
- python nltk 8 分析句子结构
- 海军领域搜狗细胞词库
- 榜单!DMS/OMS高增速,舱内感知交互摄像头供应商TOP10
- 资源管理器清楚WPS网盘、百度网盘方法
- The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path
热门文章
- mysql root 权限注入_Mysql注入root权限直接写一句话马
- python资源百度云_Python Selenium 百度云分享链接资源 批量保存
- 野火 stm32f429 pcb_PCB板价格是如何核算的
- 成功解决Eclipse窗口布局混乱或者Eclipse窗口布局出现单独独立小窗口的问题(图文教程)
- Python之pandas:pandas中to_csv()、read_csv()函数的index、index_col(不将索引列写入)参数详解之详细攻略
- Python:利用collections库实现统计单个字或单个字母的频率统计并进行降序输出、统计一个列表内重复元素并以字典形式输出
- AI公开课:19.04.18俞益洲—深睿医疗CS《计算机视觉的应用与落地》课堂笔记以及个人感悟
- Matlab:成功解决引用了已清除的变量 handles
- BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)
- 决定系数R2真的可靠吗?