C++ Primer 第Ⅲ部分笔记——类设计者的工具
1.对象移动
1.1右值引用
右值引用区别于普通引用,用两个&表示
返回左值引用的函数,连同赋值、下标、解引用和前置递增递减运算符返回左值
返回非引用的函数,连同算术、关系、位以及后置递增递减运算符都生成右值
我们不能将左值引用绑定到一个右值上,但可以使用const左值引用或右值引用绑定到一个右值上
左值持久,右值短暂
我们不能将右值引用绑定到一个变量上
1.2 标准库move函数
位于头文件utility
int &&i1 = std::move(r2);
我们可以使用move函数将左值强制转换为右值
这也意味着,我们使用move函数之后可以销毁对象,也可以给对象赋予一个新值,但我们不能使用这个对象了
1.3移动构造函数和移动赋值运算符
移动构造函数的参数为:类名&&
这里引入一个新名词 noexcept 不抛出任何异常,在参数列表后添加
我们在移动构造函数中必须另类中的数据成员回归成可析构
移动赋值运算符函数类似,但前提是要检查返回值和传进来的右值地址是否相同
1.4移动迭代器
函数make_move_iterator函数接受一个迭代器,使其成为一个移动迭代器,将其与普通的迭代器使用即可
区别在于我们使用这个函数后,这个迭代器以后就无法使用了,另外使用时会触发类的移动构造函数
2.重载与调用函数对象
2.1 重载后置++--
vec operator++(int)
{vec ret = *this;++*this;return ret;
}
2.2函数调用重载
class add
{
public:int operator() (int i,int j){return i +j;}
};
add Add;
int i = Add(2,4);
2.3 lambda是函数对象
//假设有这么一个算法表达式
stable_sort(words.begin(),words.end(),[](const string&a,const string &b) { return a.size()<b.size(); });
//其行为等价于
class ShorterString
{
public:bool operator()(const string&a,const string&b) const {return a.size()<b.size();}
};
stable_sort(words.begin(),words.end(),ShorterString());
2.4标准库定义的函数对象
头文件:functional
plus<int>add;
int i = add(2,4);
sort(vec.begin(),vec.end(),greater<int>());//按降序排序
2.5可调用对象于function
int (int,int);//是一个函数类型,接受两个int,返回一个int
int mod (int i,int j);//普通函数
auto add = [](int i,int j) {return i + j;};//lambda
struct divide{int operator() (int i,int j);//函数对象类
};
我们可以通过标准库function来统一这三种类型
比如我们需要做一个桌面计算器
map<string,function<int(int,int)>>cal;//定义一个map
cal["+"] = add;
cal["%"] = mod;
cal["/"] = divide();
但我们必须注意二义性的问题
如有必要,必须这样做
int (*p)(int,int)=add;
cal["+"] = p;
3.重载,类型转换与运算符
3.1类型转换运算符
基本形式:
operator type() const ;
4.类继承
4.1虚函数
虚函数通常在基类前声明virtual
为了防止派生类的虚函数并未覆盖基类中的虚函数,我们必须在派生类虚方法的参数列表后加上 override
如果将一个函数设为final,那么它的派生类不可覆盖他
4.2回避虚函数的机制
必须显式说明,Base::fun();
4.3抽象基类
若一个基类有一个函数在参数列表后加上了 =0
那么该基类成为抽象基类
抽象基类不能显式声明
4.4派生类与基类的转换
假设D继承B,有三种情况
只有公有继承能让用户能直接使用派生类转换为基类
任何继承方式,D的成员函数和友元都可以使用派生类转换为基类
只有公有与保护继承,D的成员和友元可以使用转换
转载于:https://www.cnblogs.com/vhyz/p/7450251.html
C++ Primer 第Ⅲ部分笔记——类设计者的工具相关推荐
- 类设计者的工具(四):面向对象程序设计 (继承)
本文为<C++ Primer>的读书笔记 目录 继承 基类 虚函数 动态绑定 (dynamic binding) 派生类 类派生列表 派生类的声明 继承的基类必须已经定义 继承基类中的虚函 ...
- c++Primer5,类设计者的工具
拷贝控制 拷贝构造函数: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. 如果没有定义拷贝构造函数,即使定义了其他构造函数,编译器也会合成一 ...
- 《C++ Primer》读书笔记
第一章 开始 类型:程序所处理的数据都保存在变量中,而每个变量都有自己的类型 内置类型:语言自身定义的类型(而形如string等类型都是标准库定义的) main的返回值:0表示成功,非0指出错误类型 ...
- 《C++ Primer 5th》笔记(7 / 19):类
文章目录 定义抽象数据类型 设计Sales_data类 关键概念:不同的编程角色 使用改进的Sales_data类 定义改进的Sales_data类 定义成员函数 引入this 引入const成员函数 ...
- C++ primer plus读书笔记与心得
C++Primer plus读书笔记与心得 2020年过年期间,因新型冠状肺炎影响,推迟复工.根据公司读书计划,将c++ primer plus 这本书复习了一遍,并将其中一些章节中自己记忆模糊或者之 ...
- C++ Primer Plus 学习笔记(第 4 章 复合类型)
C++ Primer Plus 学习笔记 第 4 章 复合类型 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 要创建数组,可使用声明语句.数组声明应指出以下三点: 存储在每个元素的 ...
- 用什么样的个人笔记类软件?OneNote、EverNote(印象笔记)、为知笔记、麦库记事、有道云笔记……...
2012年9月7日-10月10,在新浪微博由帐号@你的知识需要管理发起了"您用何种个人笔记类软件?"的投票,其间共1111个帐号参与投票,每账号最多可选为2项.投票期间510次转发 ...
- 基于Android的文本笔记类APP设计
资源下载地址:https://download.csdn.net/download/sheziqiong/85662015 资源下载地址:https://download.csdn.net/downl ...
- 整理:C primer plus 学习笔记
前言:简单看了一遍C Primer Plus, 整理了一下,因为时间比较少,自己理解地比较肤浅,所以第一版比较简陋. 假期的时候应该会有时间再整理一下.------2018/11/5 2019/1/2 ...
最新文章
- mysql创建表语句 引擎、编码和字符集设置
- 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第11章-大系统的分散控制
- 栈,寄存器,局部变量,内存,语言级别优化程序的方法
- iOS真机调试 for Xcode 5
- 由浅到深理解ROS URDF教程
- php text(),PHP+TEXT留言本(一)
- (129)System Verilog限制建仓方法
- 08-07 性能测试--性能监听平台
- java中的各个数据结构区别
- 思科路由器交换机指示灯状态详解
- 计算机网络基础之安全防范措施
- springboot初次使用template可能遇到的问题
- Lua math函数的用法
- 【论文阅读笔记】One Shot 3D Photography
- 运用matlab求身高质量指数BMI值
- 电子警察位置【收藏】
- Java面试题,208道
- Not enough Memory
- 一字节BCD码转ASCII码的算法及源码
- 【爬虫】python使用selenium抓取淘宝中的商品数据