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

C++程序设计——常见C++11新特性

一、列表初始化

1.C++98中{}的初始化问题

        在C++98中,允许使用花括号{}对数组元素进行统一的列表初始化值设定,比如:

        但是对于一些自定义类型,就无法使用这样的方式进行初始化了,比如:

就无法通过编译,导致每次定义vector时,都需要先把vector定义出来,然后使用循环对其赋初始值,非常不便。

        C++11扩大了用花括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可以添加等号,也可以不添加,没有区别。

2.自定义类型的列表初始化

多个对象的列表初始化:

        多个对象想要支持列表初始化,需要给该类(模板类)添加一个带有initializer_list类型参数的构造函数。

注意:initializer_list是系统自定义的类模板,该类模板中主要有三个方法:begin()、end()迭代器,以及获取区间中元素个数的方法size()。

#include <initializer_list>
template<class T>
class Vector {
public://支持多个对象列表初始化Vector(initializer_list<T> lt): _capacity(lt.size()), _size(0){_arr = new T[_capacity];for (auto e : lt) {_arr[_size++] = e;}}Vector<T>& operator=(initializer_list<T> lt) {delete[] _arr;_size = 0;for (auto e : lt) {_arr[_size++] = e;}return *this;}
private:T* _arr;size_t _capacity;size_t _size;
};

二、变量类型推导

1.为什么需要类型推导

        在定义变量时,必须先给出变量的实际类型,编译器才允许定义,但有些情况下可能不知道变量的实际类型,或类型写起来比较复杂。

        所有C++11中,可以使用auto根据变量初始化表达式类型来推导变量的实际类型,给程序的书写提供便利。

auto详细介绍

2.decltype类型推导

2.1为什么需要decltype

        auto使用的前提是:必须要对auto声明的类型进行初始化,否则编译器无法推导出auto的实际类型。但有些时候可能需要根据表达式运行完成后的结果类型进行推导,但是编译期间代码不会运行,此时auto也就无法完成推导了。

比如:

如果这样返回,结果就会出现问题,但如果能够使用加完之后的实际类型作为函数返回值类型,那么就不会出错了,但是这需要程序运行完后才能知道结果的实际类型。解决方法:

返回值类型追踪:

注意:auto并不能推导函数返回值类型,在这里只是起一个占位符作用。

2.2decltype的功能

decltype是根据表达式的实际类型推演出定义变量时所用的类型:

(1)推演表达式类型作为变量的定义类型;

(2)推演函数返回值类型;

(3)返回值类型追踪

注意:推演的过程中,并不会调用函数,都是在编译阶段完成的。

三、范围for循环

范围for详细介绍

四、final与override

final与override关键字介绍

五、智能指针

C++智能指针介绍与模拟实现

六、新增加容器

(1)静态数组array;

(2)循环单链表forward_list;

(3)unordered系列。

七、默认成员函数控制

1.显示缺省函数

        在C++11中,可以在默认成员函数定义或声明时,加上=default,从而显示的指示编译器生成该函数的默认版本。用=default修饰的函数称为显示缺省函数。

2.删除默认函数

如果想要限制某些默认函数的生成:

(1)C++98中:将该函数设置为private,并且只声明不定义。

(2)C++11中:只需要在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,用=delete修饰的函数称为删除函数。

八、右值引用

C++右值引用

九、lambda表达式

C++lambda表达式

http://www.lryc.cn/news/65180.html

相关文章:

  • Rust main 函数返回值类型不能是 String
  • 视频里的音乐怎么转换成mp3格式?
  • CSS3 grid网格布局
  • SPSS如何进行均值比较和T检验之案例实训?
  • Packet Tracer - 配置交换机端口安全
  • 一图看懂 aiohttp 模块:基于 asyncio 的异步HTTP网络库, 资料整理+笔记(大全)
  • Linux + 香橙派 + V4L2 + http 实现远程监控摄像头在网页端显示
  • 《编码——隐匿在计算机软硬件背后的语言》精炼——第15-16章(十六进制,RAM)
  • leetcode.1376 通知所有员工所需的时间 - bfs/dfs + 树
  • AtCoder Beginner Contest 300——A-G题讲解
  • Go:值与指针
  • 【Linux】进程学习(2)---理解进程操作
  • 基于springcloud实现的医院信息系统
  • 设计模式-创建型模式-(工厂、简单工厂、抽象工厂)
  • JAVA12新特性
  • Nginx 静态文件、反向代理、负载均衡、缓存、SSL/TLS 加密、gzip 压缩 等等
  • Linux设备驱动模型(一)
  • 【Python入门篇】——Python基础语法(标识符与运算符)
  • 扩展 VirtualBox 已分配磁盘的方法
  • 【LeetCode】646. 最长数对链
  • Makefile教程(Makefile的结构)
  • SpringMVC(后)SSM整合
  • 【博弈论】【第一章】博弈论导论
  • keil移植linux(makefile)
  • C++——类和对象(3)
  • itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析
  • linux中使用docker部署微服务
  • 操作系统考试复习—第三章 优先级倒置 死锁问题
  • OpenHarmony送显流程分析
  • Java面试题字节流字符流