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

[C++] C++11详解 (一)

标题:[C++] C++11详解 (一)

@水墨不写bug



目录

前言

一、列表初始化

二、STL的初始化列表(initializer_list —— Cplusplus.com)

三、声明方式(auto、decltype、nullptr)

1.auto

​编辑 2.decltype


正文开始:

前言

        从本文开始,我们认识进入一个重要的知识:C++11的新语法。本文旨在讲解C++11的新语法,让大家对近年来C++的发展有一个纵向的认识。


一、列表初始化

        C++11中,你几乎可以使用花括号“{}”对大多数容器进行初始化:(并且 赋值符号“=”可以省略)

        准确来说:如果STL中一种容器,它有初始化列的构造函数,就意味着可以使用初始化列对它初始化:

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
int main()
{string s = {'a','b','c','d','\0'};	//string s{'a','b','c','d','\0'};vector<int> v = {1,2,3,4};//vector<int> v{1,2,3,4};map<int,int> m = {{1,2},{2,3}};//map<int,int> m{{1,2},{2,3}};set<int> se = {1,2};//set<int> se{1,2};return 0;
}

        此外,对于数组,任意的内置类型和自定义类型,也可用初始化列进行初始化:

struct Point
{int _x;int _y;
};int main()
{int x1 = 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C++11中列表初始化也可以适用于new表达式中int* pa = new int[4]{ 0 };return 0;
};

 创建对象时也可以使用列表初始化方式调用构造函数初始化:

class Date
{
public:Date(int year, int month, int day):_year(year),_month(month),_day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2022, 1, 1); // old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };return 0;
}

二、STL的初始化列表(initializer_list —— Cplusplus.com)

        C++11中,新增了initializer_list这种容器,它拥有自己的构造,begin(),end()等迭代器。

        一般来说,initializer_list用于作为构造函数的参数;这也是C++11中,不少容器新增初始化列的构造函数的原因。

        std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值:

int main()
{vector<int> v = { 1,2,3,4 };list<int> lt = { 1,2 };// 这里{"sort", "排序"}会先初始化构造一个pair对象map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };// 使用大括号对容器赋值v = {10, 20, 30};return 0;
}

三、声明方式(auto、decltype、nullptr)

1.auto

        在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。

        C++11中废弃auto原来的用法,将其用于实现自动类型推测。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

int main()
{int i = 10;auto p = &i;//p是int*auto pf = strcpy;//pf是char*map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };//map<string, string>::iterator it = dict.begin();//使得声明类型不再是一件头大的事auto it = dict.begin();return 0;
}

 2.decltype

        关键字decltype将变量的类型声明为表达式指定的类型:

// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{decltype(t1 * t2) ret;cout << typeid(ret).name() << endl;
}int main()
{const int x = 1;double y = 2.2;decltype(x * y) ret; // ret的类型是double//如果是int乘以int,则推测为int//这样就方便声明类型,不用写死,而是在运行时确定decltype(&x) p; // p的类型是int*cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;F(1, 'a');return 0;
}

补充:关于nullptr与范围for,参考之前这篇《初识C++(4)》


完~

未经作者同意禁止转载

相关文章:

  • 【模型】Temporal Fusion Transformer (TFT) 模型
  • 算法学习-基础算法
  • Visual Studio 2022 自定义字体大小
  • 摄像头设备问题如何检测
  • leetcode518:零钱兑换II
  • minio 后端大文件分片上传,合并,删除分片
  • 【线程安全】ReentrantLock和synchronized的使用示例——言简意赅
  • 【嵌入式开发之网络编程】TCP并发实现
  • 主场竞争,安踏把背影留给耐克
  • Java13 网络编程
  • 【pytorch】固定(freeze)住部分网络
  • MyBatis一级缓存和二级缓存以及 mybatis架构
  • 五指生望京新店开业,开启健康之旅
  • 用AppleScript做macOS UI自动化
  • 外卖系统开发:如何打造一个无缝衔接的用户体验?
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【css3】浏览器内核及其兼容性
  • Angular2开发踩坑系列-生产环境编译
  • Hibernate最全面试题
  • learning koa2.x
  • PHP面试之三:MySQL数据库
  • Python打包系统简单入门
  • socket.io+express实现聊天室的思考(三)
  • Spring Boot快速入门(一):Hello Spring Boot
  • STAR法则
  • TypeScript迭代器
  • Vue小说阅读器(仿追书神器)
  • Webpack 4x 之路 ( 四 )
  • 闭包,sync使用细节
  • 代理模式
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 规范化安全开发 KOA 手脚架
  • 基于webpack 的 vue 多页架构
  • 配置 PM2 实现代码自动发布
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 说说动画卡顿的解决方案
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (PADS学习)第二章:原理图绘制 第一部分
  • (层次遍历)104. 二叉树的最大深度
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分布式缓存)Redis哨兵
  • (接口封装)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)原始图像数据和PDF中的图像数据
  • (自用)gtest单元测试
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net Remoting(分离服务程序实现) - Part.3