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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Crash 的文明世界

题目描述 给一棵树&#xff0c;求以每个点为根时下列式子的值。 题解 当k1时这就是一个经典的换根dp问题。 所以这道题还是要用换根dp解决。 部分分做法&#xff1a; 考虑转移时是这样的一个形式(图是抄的)。 用二项式定理展开就可以nk2做了。 观察到结果是一个xk的形式。 然后…

wampServer配置WWW根目录遇到的坑

直接在官网下载之后开始安装&#xff0c;一切正常 打开使用&#xff0c;一切正常 设置WWW目录。坑了一波 按照的都是百度上的教程&#xff0c;设置httpd.conf 这里配置之后网页访问127.0.0.1 还是localhost都还是原始的www目录 后来 我发现了这里 是配置虚拟URL的地方。以上是正…

windows安装程序创建_如何在Windows上创建已安装程序的列表

windows安装程序创建Reinstalling Windows is a good way to fix serious problems with your computer, or just to get a fresh slate. But before you reinstall Windows, you should make a list of programs you currently have installed on your PC so you know what yo…

实现一个更新所有 dotnet tool 的 dotnet tool

实现一个更新所有 dotnet tool 的 dotnet toolIntrodotnet tool 是从 .NET Core 2.1 开始支持的命令行工具&#xff0c;在使用 dotnet tool 比较多了的时候&#xff0c;想要更新所有的 dotnet tool 就比较麻烦&#xff0c;而目前 .NET SDK 还不支持&#xff0c;也有一些人希望能…

C# 普通权限运行程序\非管理员运行\降低权限运行

一、目的与实际 1.VS设置管理员权限运行程序后&#xff0c;发现调用powershell命令或程序需要普通权限即可&#xff0c;Administrator权限反而错。 2.网上搜索关键字&#xff0c;大部分都是怎么使用管理员权限运行。 3.bing搜索意外发现有相关资料&#xff0c;记录分享。 二…

am335x PDK3.0 设置为单网口配置记录

原来的配置是双网口的&#xff0c;现在要配置为单网口。一直以为这个配置是在 make menuconfig 里面&#xff0c; 没想到是在设备树里面。修改设备树// vim arch/arm/boot/dts/am335x-sbc7109.dts722 &mac {723 pinctrl-names "default", "sleep"…

[AHOI2009]飞行棋 BZOJ1800

题目描述 给出圆周上的若干个点&#xff0c;已知点与点之间的弧长&#xff0c;其值均为正整数&#xff0c;并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的&#xff0c;并希望在最短时间内找出所有不重复矩形。 输入输出格式 输入格式&#xff1a;第一行为正整数N&…

webapi+Quartz.NET解决若干定时程序同时运行的问题

项目现状&#xff1a; 有若干定时程序需要自启动运行&#xff0c;为了简便程序部署等问题&#xff0c;采取这种办法把定时程序集中管理到webapi中跟随api发布 代码架构介绍&#xff1a; 新建一个类库&#xff0c;类库引用Quartz&#xff08;Quartz.2.3.2&#xff09;&#xff0…

mac恢复iphone_免费下载:旧Mac和iPhone壁纸的令人震惊的完整档案

mac恢复iphoneLove or hate Apple, you’ve got to admit: their background images are consistently stunning. Now you can download all of them. 爱或恨苹果&#xff0c;您必须承认&#xff1a;它们的背景图像始终令人赞叹。 现在&#xff0c;您可以下载所有这些文件。 A …

Django01-1: request 方法

#POST request.method #返回全大写字符穿&#xff0c;<class str> POST/GETrequest.POST #用户提交数据&#xff0c;不包含文件 #<QueryDict>request.POST.get(hobby) #拿列表最后一个 request.POST.getList(hobby) #拿多个&#xff0c;列表全部#GET 获取url &a…

Magicodes.IE 2.7.1发布

2.7.12022.12.01Magicodes.IE.EPPlus默认添加SkiaSharp.NativeAssets.Linux.NoDependencies包&#xff0c;以便于在Linux环境下使用导入验证支持将错误数据通过Stream的方式返回&#xff0c;感谢sampsonye &#xff08;见pr#466&#xff09;2.7.02022.11.07添加SkiaSharp移除Si…

Oracle监听的静态注册和动态注册

静态注册&#xff1a;通过解析listene.ora文件 动态注册&#xff1a;由PMON进程动态注册至监听中 在没有listener.ora配置文件的情况下&#xff0c;如果启动监听&#xff0c;则监听为动态注册。用图形化netca创建的监听&#xff0c;默认也为动态注册 1.静态注册 listener.ora文…

AKOJ-1695-找素数

题意&#xff1a; 给定区间L&#xff0c;R。 计算区间中素数个数。 2 < L,R < 2147483647, R-L < 1000000。 思路&#xff1a; 素数区间筛 先筛(2-sqrt(r))。 再用(2-sqrt(r))中的素数筛(l-r)。 代码: 1.自己写的区间筛&#xff0c;将筛2-sqrt&#xff08;r) 分开了。…

Spring 环境与profile(一)——超简用例

什么是profile,为什么需要profile? 在开发时&#xff0c;不同环境&#xff08;开发、联调、预发、正式等&#xff09;所需的配置不同导致&#xff0c;如果每改变一个环境就更改配置不但麻烦&#xff08;修改代码、重新构建&#xff09;而且容易出错。Spring提供了解决方案。 方…

Django04-1: ORM增删改查

ORM 增删改查 一、字段增加 #终端输入 1.model里添加字段&#xff0c; 2.执行迁移命令。 3.终端里输入默认值&#xff0c;继续执行迁移命令。 #允许为空 再nulltrue&#xff0c;终端不需要输入默认值 #设置默认值 defalult‘xxxx‘ 二、字段修改 1.直接修改代码&…

Comcast以纯文本泄露客户Wi-Fi登录信息,立即更改密码

A Comcast Xfinity website was leaking Wi-Fi names and passwords, meaning now is a good time to change your Wi-Fi passcode. Comcast Xfinity网站泄漏了Wi-Fi名称和密码&#xff0c;这意味着现在是更改Wi-Fi密码的好时机。 The site, intended to help new customers se…

SpringBoot详解(一)-快速入门

SpringBoot详解系列文章&#xff1a;SpringBoot详解&#xff08;一&#xff09;-快速入门SpringBoot详解&#xff08;二&#xff09;-Spring Boot的核心SpringBoot详解&#xff08;三&#xff09;-Spring Boot的web开发SpringBoot详解&#xff08;四&#xff09;-优雅地处理日志…

龙芯上跑WTM,为国产化做点贡献

点击上方蓝字关注我哦“信创”&#xff0c;是一项国家战略&#xff0c;即信息技术应用创新产业&#xff0c;它是数据安全、网络安全的基础&#xff0c;也是新基建的重要组成部分。信创从名称上来看本意指向创新&#xff0c;但是自从漂亮国亲手撕碎了“科技没有国界”的谎言之后…

Class与Style绑定

对于数据绑定&#xff0c;一个常见的需求是操作元素的class列表和它的内联样式。因为它们都是attribute&#xff0c;我们可以用v-bind处理它们&#xff1a;只需要计算出表达式最终的字符串。不过&#xff0c;字符串拼接麻烦又易错。因此&#xff0c;在v-bind用于class和style时…

PHP安装之configure的配置参数

1、生成环境安装配置如下 要求安装如下库&#xff1a; imagickgdmysqlmysqlimysqlndphalconPharsoapsocketsxwebxsvczipzlib 具体查看 vim php-config 就可以知道是如何配置的 --prefix/home/php --with-config-file-path/home/php/etc --with-mysql --with-pdo-oci --with-ope…