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 第Ⅲ部分笔记——类设计者的工具相关推荐

  1. 类设计者的工具(四):面向对象程序设计 (继承)

    本文为<C++ Primer>的读书笔记 目录 继承 基类 虚函数 动态绑定 (dynamic binding) 派生类 类派生列表 派生类的声明 继承的基类必须已经定义 继承基类中的虚函 ...

  2. c++Primer5,类设计者的工具

    拷贝控制   拷贝构造函数: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. 如果没有定义拷贝构造函数,即使定义了其他构造函数,编译器也会合成一 ...

  3. 《C++ Primer》读书笔记

    第一章 开始 类型:程序所处理的数据都保存在变量中,而每个变量都有自己的类型 内置类型:语言自身定义的类型(而形如string等类型都是标准库定义的) main的返回值:0表示成功,非0指出错误类型 ...

  4. 《C++ Primer 5th》笔记(7 / 19):类

    文章目录 定义抽象数据类型 设计Sales_data类 关键概念:不同的编程角色 使用改进的Sales_data类 定义改进的Sales_data类 定义成员函数 引入this 引入const成员函数 ...

  5. C++ primer plus读书笔记与心得

    C++Primer plus读书笔记与心得 2020年过年期间,因新型冠状肺炎影响,推迟复工.根据公司读书计划,将c++ primer plus 这本书复习了一遍,并将其中一些章节中自己记忆模糊或者之 ...

  6. C++ Primer Plus 学习笔记(第 4 章 复合类型)

    C++ Primer Plus 学习笔记 第 4 章 复合类型 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 要创建数组,可使用声明语句.数组声明应指出以下三点: 存储在每个元素的 ...

  7. 用什么样的个人笔记类软件?OneNote、EverNote(印象笔记)、为知笔记、麦库记事、有道云笔记……...

    2012年9月7日-10月10,在新浪微博由帐号@你的知识需要管理发起了"您用何种个人笔记类软件?"的投票,其间共1111个帐号参与投票,每账号最多可选为2项.投票期间510次转发 ...

  8. 基于Android的文本笔记类APP设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/85662015 资源下载地址:https://download.csdn.net/downl ...

  9. 整理:C primer plus 学习笔记

    前言:简单看了一遍C Primer Plus, 整理了一下,因为时间比较少,自己理解地比较肤浅,所以第一版比较简陋. 假期的时候应该会有时间再整理一下.------2018/11/5 2019/1/2 ...

最新文章

  1. mysql创建表语句 引擎、编码和字符集设置
  2. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第11章-大系统的分散控制
  3. 栈,寄存器,局部变量,内存,语言级别优化程序的方法
  4. iOS真机调试 for Xcode 5
  5. 由浅到深理解ROS URDF教程
  6. php text(),PHP+TEXT留言本(一)
  7. (129)System Verilog限制建仓方法
  8. 08-07 性能测试--性能监听平台
  9. java中的各个数据结构区别
  10. 思科路由器交换机指示灯状态详解
  11. 计算机网络基础之安全防范措施
  12. springboot初次使用template可能遇到的问题
  13. Lua math函数的用法
  14. 【论文阅读笔记】One Shot 3D Photography
  15. 运用matlab求身高质量指数BMI值
  16. 电子警察位置【收藏】
  17. Java面试题,208道
  18. Not enough Memory
  19. 一字节BCD码转ASCII码的算法及源码
  20. 【爬虫】python使用selenium抓取淘宝中的商品数据

热门文章

  1. LeetCode14 Longest Common Prefix
  2. 安装 openSUSE Leap 42.1 之后要做的 8 件事
  3. JAVA笔记(十四)
  4. 看看老外是如何理解抽象类的
  5. C# 与java区别总结 收集
  6. Class 创建性能大比拼(反射,泛型反射,泛型创建,缓存Emit,非缓存Emit)
  7. 【WP7进阶】——扩展框架组件
  8. spacy库的安装与使用_为 SpaCy 提供的中文数据模型
  9. 文件系统模拟程序python_如何使用sh实现Python虚拟文件系统
  10. mysql创建索引语句