当前位置: 首页 > news >正文

c++11上篇

c++11

    • 1.C++11简介
    • 2.列表初始化
      • 2.1 {}初始化
      • 2.2 std::initializer_list
    • 3.变量类型推导
      • 3.1 auto
      • 3.2 decltype
      • 3.3 nullptr
    • 4.范围for循环
    • 5.final与override
    • 6.智能指针
    • 7.新增加容器---静态数组array、forward_list以及unordered系列
    • 8.默认成员函数控制
    • 9.右值引用
      • 9.1 左值引用和右值引用

1.C++11简介

C++11 是第二个真正意义上的 C++ 标准,也是 C++ 的一次重大升级。C++11 增加了很多现代编程语言的特性,比如自动类型推导、智能指针、lambda 表达式等,这使得 C++ 看起来又酷又潮,一点也不输 Java和 C#。

2.列表初始化

2.1 {}初始化

class Date
{
public:Date(int y,int m,int d):_y(y),_m(m),_d(d){}~Date(){}private:int _y;int _m;int _d;
};
int main()
{int a{ 100 };vector<int> v{ 1,1,1 };int m[3]{ 5,5,5 };Date d{ 2021,2,5 };return 0;
}

2.2 std::initializer_list

可以看出这是一个已经实现好的类;

它的作用呢就是可以实现对所有的类型实现{}赋值;

对于自定义类型可以直接重载一个来使用;

template<class T>
class myvector
{typedef T* myiterator;
public:myvector(initializer_list<T> i){start = new T[i.size()];finsh = start + i.size();end = finsh;myiterator it = start;typename initializer_list<T>::iterator t = i.begin();while (t != i.end()){*it = *t;it++;t++;}}~myvector(){}private:myiterator start;myiterator finsh;myiterator end;
};

3.变量类型推导

3.1 auto

自动推导类型

int main()
{myvector<int> mv{ 1,2,3,5,5,6 };auto v={ 1,2,3,4,5,6 };cout << typeid(v).name() << endl;//vector<int> v{ 1,2,3,5,5,6 };//cout << mv << endl;/*cout << NULL << endl;nullptr;*/return 0;
}

3.2 decltype

关键字decltype将变量的类型声明为表达式指定的类型(和auto差不多)

3.3 nullptr

4.范围for循环

底层就是通过迭代器实现,所以只要实现了迭代器的数据结构都可以使用范围for;

5.final与override

在继承和多态讲过,final表示禁止继承,override表示判断子类继承的虚函数有没有重写;

6.智能指针

因为指针在c/c++只太重要了,所以我们在普通的指针基础上实现智能指针,其中包括unique_ptr等等等,在等后期具体写毕竟指针才是c/c++的精髓~~~!

7.新增加容器—静态数组array、forward_list以及unordered系列

8.默认成员函数控制

因为有了右值引用c++出现了一个移动构造,一个移动赋值重载;

注意:

如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任
意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类
型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,
如果实现了就调用移动构造,没有实现就调用拷贝构造。
如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中
的任意一个,那么编译器会自动生成一个默认移动赋值。默认生成的移动赋值重载函数,对于内
置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋
值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。(默认移动赋值跟上面移动构造
完全类似)

就是一句话你没有实现移动的构造或者赋值重载的情况下也没有写析构,拷贝构造,拷贝赋值重载的情况下编译器才会给你实现一个默认的移动。。。;

如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。

强制生成默认函数的关键字default:
C++11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数,但是因为一些原
因这个函数没有默认生成。比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以
使用default关键字显示指定移动构造生成

class Person
{
public:Person(const char* name = "", int age = 0):_name(name), _age(age){}Person(const Person& p):_name(p._name), _age(p._age){}Person(Person&& p) = default;//有这句s3会调用这个没有的话就调用上面的一个
private:string _name;int _age;
};
int main()
{Person s1;Person s2 = s1;Person s3 = std::move(s1);return 0;
}

禁止生成默认函数的关键字delete:
如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且只声明补丁
已,这样只要其他人想要调用就会报错。在C++11中更简单,只需在该函数声明加上=delete即
可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。

9.右值引用

9.1 左值引用和右值引用

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们
之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。
什么是左值?什么是左值引用?
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋
值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左
值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

int main()
{// 以下的p、b、c、*p都是左值int* p = new int(0);int b = 1;const int c = 2;// 以下几个是对上面左值的左值引用int*& rp = p;int& rb = b;const int& rc = c;int& pvalue = *p;return 0;
}
class A
{
public:A(const int& b):a(b){cout << "构造&" << endl;}A(const int&& b):a(b){cout << "构造&&" << endl;}void operator=(int&& a){cout << "void operator=(int&& a)" << endl;}void operator=(int& a){cout << "void operator=(int& a)" << endl;}void operator=(const int&& a){cout << "void operator=(const int&& a)" << endl;}void operator=(const int& a){cout << "void operator=(const int& a)" << endl;}
private:int a;
};void fun(A&& a)
{a = 100;
}
int main()
{const int m = 10;A b(m);//左值A a(100);//右值A c(move(m));//右值a = m;//左值b = 100;//右值c = move(m);//右值fun(100);fun(m);return 0;
}

一般情况我们右值不是这么玩的,而是在模板里面实现一种叫做完美转发的事情;

void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }
void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }
// 模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
// 模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,
// 但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,
// 我们希望能够在传递过程中保持它的左值或者右值的属性, 就需要用我们下面学习的完美转发
template<typename T>
void PerfectForward(T&& t)
{Fun(t);
}
int main()
{PerfectForward(10); // 右值int a;PerfectForward(a); // 左值PerfectForward(std::move(a)); // 右值const int b = 8;PerfectForward(b); // const 左值PerfectForward(std::move(b)); // const 右值return 0;
}

为什么全部变成了左值呢???看来模板中的&&只是一种可以接收左值和右值的操作!

那么我们怎么样可以实现完美转发呢?

只需要一个forward函数就可!

这个函数不是一次转发就可以,只要是你使用了万能引用的模板都必须使用forward来转发保证变量的特性不会衰减到左值

相关文章:

c++11上篇

c11 1.C11简介2.列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list 3.变量类型推导3.1 auto3.2 decltype3.3 nullptr 4.范围for循环5.final与override6.智能指针7.新增加容器---静态数组array、forward_list以及unordered系列8.默认成员函数控制9.右值引…...

异构无线传感器网络路由算法研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​无线传感器网络(Wireless Sensor Networks, WSN)是一种新型的融合传感器、计算机、通信等多学科的信息获取和处理技术的网络,…...

MySQL数据库——MySQL TRUNCATE:清空表记录

MySQL 提供了 DELETE 和 TRUNCATE 关键字来删除表中的数据。下面主要讲解一下 TRUNCATE 关键字的使用。 TRUNCATE 关键字用于完全清空一个表。其语法格式如下&#xff1a; TRUNCATE [TABLE] 表名 其中&#xff0c;TABLE 关键字可省略。 例 1 新建表 tb_student_course&…...

财报解读:连续三年逆势增长的背后,欧派家居到底靠的是什么?

能在过去3年逆势增长的家居企业并不多&#xff0c;而欧派家居就是其中一个。4月25日&#xff0c;欧派家居发布2022年年度报告。据年报数据显示&#xff0c;2022年&#xff0c;欧派家居共实现营业收入224.80亿元&#xff0c;净利润约26.88亿元。 从2020年到2022年&#xff0c;欧…...

希望计算机专业同学都知道这些宝藏博主

湖科大教书匠——计算机网络 “宝藏老师”、“干货满满”、“羡慕湖科大”…这些都是网友对这门网课的评价&#xff0c;可见网课质量之高&#xff01; 湖南科技大学《计算机网络》微课堂是该校高军老师精心制作的视频课程&#xff0c;用简单的语言描述复杂的问题&#xff0c;…...

1694_week1_MIT使用Python编程学习手记1

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下&#xff0c;这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准&#xff0c;很可能会有大量的疏漏。再此&#xff0c;我只想把自己学习时候的一…...

第二十一章 光源

光源是每个场景必不可少的部分&#xff0c;光源除了能够照亮场景之外&#xff0c;还可以产生阴影效果。 Unity中分为四种光源类型&#xff1a; 1. 方向光&#xff1a;Directional Light 用于模拟太阳光&#xff0c;方向光任何地方都能照射到。 2. 点光源&#xff1a;Point L…...

CVPR 2023 超分辨率(super-resolution)方向上接收论文总结

目录 CVPR 2023图像超分任意尺度超分盲超分 视频超分特殊场景 总结参考资料 CVPR 2023 官网链接&#xff1a;https://cvpr2023.thecvf.com/ 会议时间&#xff1a;2023年6月18日-6月22日&#xff0c;加拿大温哥华 CVPR 2023统计数据&#xff1a; 提交&#xff1a;9155篇论文接…...

Python 基于 Django 的学生成绩管理系统,可视化界面(附源码,教程)

1简介 对于学生成绩管理系统&#xff0c;充分运用现代化的信息技术手段&#xff0c;对于学生成绩信息管理发展的趋势就是信息化&#xff0c;信息化时代下的信息管理&#xff0c;需要深化信息管理体制与手段的改革&#xff0c;充分运用信息化手段来全方位的进行学生成绩管理系统…...

第二弹进阶吴恩达 ChatGPT Prompt 技巧

第一弹笔记在这里&#xff1a; 总结吴恩达 ChatGPT Prompt 免费课程 今天分享第二弹&#xff0c;进阶篇。 第一点&#xff0c;任务序列化。 通常看完一篇长文&#xff0c;脑子里往往充满无数疑问。急切想知道所有答案&#xff0c;必须列一个问题清单。对话式问法&#xff0c;对…...

约瑟夫环问题

约瑟夫问题 题目描述 n n n 个人围成一圈&#xff0c;从第一个人开始报数,数到 m m m 的人出列&#xff0c;再由下一个人重新从 1 1 1 开始报数&#xff0c;数到 m m m 的人再出圈&#xff0c;依次类推&#xff0c;直到所有的人都出圈&#xff0c;请输出依次出圈人的编号。…...

JavaScript中的异步编程

当我们在编写JavaScript代码时&#xff0c;经常会遇到需要执行长时间运行的任务的情况&#xff0c;例如从服务器获取数据或进行复杂的计算。在这些情况下&#xff0c;我们不希望阻塞用户界面&#xff0c;因为这会使网站看起来卡顿&#xff0c;甚至无响应。为了避免这种情况&…...

奥斯汀独家对话|从机构的「拉扯」中成长的美国加密监管

‍前言 4月25日&#xff0c;在美国得克萨斯州的首府奥斯汀&#xff0c;这座充满活力和创造力的城市&#xff0c;欧科云链研究院与来自哥伦比亚商学院的Austin Campbell教授就美国加密监管以及其相关话题进行了一次深入探讨。双方讨论了美国整体的监管问题、监管逻辑、最新的稳…...

PostgreSQL16中pg_dump的LZ4和ZSTD压缩

PostgreSQL16中pg_dump的LZ4和ZSTD压缩 pg_dump压缩lz4和zstd LZ4和ZSTD压缩算法合入了PG16。LZ4补丁的作者是Georgios Kokolatos。由Tomas Vondra提交。由Michael Paquier、Rachel Heaton、Justin Pryzby、Shi Yu 和 Tomas Vondra 审阅。提交消息是&#xff1a; Expand pg_dum…...

网络安全基础入门学习路线

在大多数的思维里总觉得学习网络安全得先收集资料、学习编程、学习计算机基础&#xff0c;这样不是不可以&#xff0c;但是这样学效率太低了&#xff01; 你要知道网络安全是一门技术&#xff0c;任何技术的学习一定是以实践为主的。也就是说很多的理论知识其实是可以在实践中…...

错误检测技术:奇偶校验

文章目录 参考描述奇校验与偶校验错误检测技术奇偶校验 奇校验与偶校验奇校验偶校验局限性漏网之鱼 奇偶校验的三种形式水平奇偶校验垂直奇偶校验水平垂直奇偶校验优劣漏网之鱼 参考 项目描述搜索引擎Google 、Bing百度百科奇偶校验计算机网络 基础与应用&#xff08;微课版&a…...

语义版本控制规范(SemVer)

Semantic Versioning 2.0.0 官网 给出一个版本号MAJOR.MINOR.PATCH&#xff0c;增加如下&#xff1a; MAJOR version 进行不兼容的API更改时MINOR version 当您以向后兼容的方式添加功能时PATCH version 当您进行向后兼容的错误修复时 预发布(pre-release )和构建元数据的附…...

基于Flask的留言板的设计与实现

这是《Flask Web开发实战:入门、进阶与原理解析》这本书中的一个小项目&#xff0c;我在学习后根据书中的教程实现了留言板的功能&#xff0c;并结合我的思路将代码做了一些调整。 下面这是实现后的展示图片 文章目录 设计思路项目代码exts.pymodels.pyforms.pyerrors.pycomma…...

vmware 详细安装教程

一.VM是什么&#xff1f; VMware Workstation是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统&#xff0c;在系统切换时需…...

Python 爬虫工具

Python3 默认提供了urllib库&#xff0c;可以爬取网页信息&#xff0c;但其中确实有不方便的地方&#xff0c;如&#xff1a;处理网页验证和Cookies&#xff0c;以及Hander头信息处理。 为了更加方便处理&#xff0c;有了更为强大的库 urllib3 和 requests, 本节会分别介绍一下…...

再也不去字节跳动面试了,6年测开经验的真实面试经历.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…...

第十五章 角色移动旋转实例

本章节我们创建一个“RoleDemoProject”工程&#xff0c;然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包&#xff0c;这个场景很大&#xff0c;大家需要调整场景视角才能看清。 接下来&#xff0c;我们添加一个人物模型&#xff0c;操作方式就是将模型文…...

数据湖Data Lakehouse支持行级更改的策略:COW、MOR、Delete+Insert

COW:写时复制,MOR:读时合并,Delete+Insert:保证同一个主键下仅存在一条记录,将更新操作转换为Delete操作和Insert操作 COW和MOR的对比如下图,而Delete+Insert在StarRocks主键模型中用到。 目前COW、MOR在三大开源数据湖项目的使用情况,如下图。 写入时复制【Copy-On…...

双亲委派机制的原理和作用

双亲委派机制&#xff0c;就必须弄清楚Java的类加载器。 什么是类加载器 Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分&#xff0c;负责动态的将Java类加载到Java虚拟机的内存空间。 类加载器有哪些 主要有三个&#xff1a; 引导类加载器(Bootstrap ClassLoade…...

mac免费杀毒软件哪个好用?如何清理mac系统需要垃圾

CleanMyMac x是一款功能强大的Mac系统优化清理工具&#xff0c;使用旨在帮助用户更加方便的清理您系统中的所有垃圾&#xff0c;从而加快电脑运行速度&#xff0c;保持最佳性能&#xff0c;更加稳定、流畅、快速&#xff01;&#xff01;&#xff01; CleanMyMac X无疑是目前m…...

css 实现太极效果

目录 一、简述二、太极效果制作 一、简述 本次主要介绍::after&#xff0c;::before&#xff0c;box-shadow这三个属性。 ::after&#xff0c;::before这两个是伪类选择器&#xff0c;box-shaow是用来设置元素的阴影效果 before:向选定的元素前插入内容 after:向选定的元素后插…...

【前端基础知识】Vue中的变量不是响应式的吗?属性赋值后视图不变化的原因是什么?

目录 &#x1f914;问题&#x1f4dd;回答&#x1f3a8;使用场景动态添加属性动态添加数组元素 ❌注意事项$set只能在响应式对象上使用$set不能用于根级别的属性$set的性能问题 &#x1f4c4;总结 &#x1f914;问题 Vue是一款在国内非常流行的框架&#xff0c;采用MVVM架构&a…...

如何完全卸载linux下通过rpm安装的mysql

卸载linux下通过rpm安装的mysql 1.关闭MySQL服务2.使用 rpm 命令的方式查看已安装的mysql3. 使用rpm -ev 命令移除安装4. 查询是否还存在遗漏文件5. 删除MySQL数据库内容 1.关闭MySQL服务 如果之前安装过并已经启动&#xff0c;则需要卸载前请先关闭MySQL服务 systemctl stop…...

[渗透教程]-004-长城防火墙GFW的原理

文章目录 1. baidu.com 请求过程2. GFW原理2.1 GFW拦截方法1:DNS渲染2.2 通过IP黑名单2.3 VPN阻断1. baidu.com 请求过程 家庭的路由器具备了交换机的功能.域名–>ip,优先检测本地的缓存,没有的话就查找DNS服务器,传输层对应该层的数据进行封装增加了端口的信息,网络层对传输…...

LaTeX基础文本排版命令

LaTeX基础文本排版命令 1. 字体大小2. 字体的粗体与斜体2.1. 粗体2.2 斜体2.3 同时启用粗体和斜体 3. 空格长度4. 高度与宽度尺寸 在LaTeX中&#xff0c;文本排版可以通过简单的命令实现&#xff0c;这些命令可以控制字体大小、粗体与斜体、空格、行高和宽度等方面&#xff0c;…...

樟木头镇网站仿做/搜索词和关键词

每一篇文章都是一个知识点&#xff0c;一个小小的代码实践&#xff0c;总有一篇是你想要的&#xff01;小实战全网首发&#xff01;华为任正非&#xff0c;近20年400多段高清音频演讲故宫下雪了&#xff01;我花了45秒&#xff0c;用Python给它画了一组手绘图2.14情人节&#x…...

深圳网站建设与推广/排名seo公司

点击打开链接/// <summary>/// 截取全屏的方法包括UI/// </summary>public void CaptureScreen(){Application.CaptureScreenshot("截取全屏.png", 0);Debug.Log(1);}/// <summary>/// 自定义截图大小其中包含UI/// </summary>public Textur…...

榆垡网站建设/搜一搜百度

这个教程主要是分享如何快速组建WAMP开发环境&#xff0c;对于软件的详细配置&#xff0c;自行参考文档或搜索。 Visual C Redistributable for Visual Studio 2015 下载地址&#xff1a;https://www.microsoft.com/zh-CN/download/details.aspx?id48145 (个人测试window10下不…...

北京公司注册地址多少钱一年/王通seo赚钱培训

解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题参考文章&#xff1a; &#xff08;1&#xff09;解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题 &#xff08;2&#xff09;https://www.cnblogs.com/Bo…...

网站的功能包括哪些/搜索网络如何制造

2019独角兽企业重金招聘Python工程师标准>>> 1 下载所需要的jdk和maven版本上传到服务器&#xff08;ftp&#xff09; &#xff08;chmod x 设置权限 变绿代码有权限了&#xff09; 2 安装jdk&#xff0c;配置环境变量&#xff0c;安装maven&#xff0c;配置环境变量…...

seo推广怎么收费/seo技术优化技巧

1.右键单击&#xff0c;选择 Import&#xff0c;进入导入项目窗口 图片.png2.点击选择从SVN检出项目&#xff0c;点击Next下一步 图片.png3.选择创建新的资源库位置&#xff0c;点击Next&#xff0c;如果项目之前已经导入过删除掉了&#xff0c;重新导入的时候&#xff0c;只需…...