C++11的新特性简单汇总介绍 (一)

2020-01-06 15:36:04王旭

什么是C++11

C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外)。

C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、decltype,和模板的大量改进。

1. 概述

最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力。C++ Primer5是学习C++11的比较好的书籍。这篇文章仅总结关于C++11中的新东西,老的东西不再赘述。本文的所有代码仅仅值列出关键代码,并且所有特性都已经用编译器验证过,我的编译环境 gcc 5.3.1  g++ 5.3.1 ,据说 4.7以上的版本已经支持大部分C++11的特性,VS系列的编译器对C++11的支持情况不甚了解,如果没有合适的编译器,可以点击这里 C++shell 这是一个在线的C++编译系统,里面有多个选项可以选择C++98,C++11,C++14等,可以在这里面验证C++11的正确性。

2. long long 类型

long long 类型实际上没有在C++ 98中存在,而之后被C99标准收录,其实现在市面上大多数编译器是支持 long long 的,但是这个类型正式成为C++的标准类型是在C++11中。标准要求long long至少是64位也就是8个字节。一个字面常量使用LL后缀表示long long类型,使用ULL后缀表示unsigned long long 类型。

3. 列表初始化

C++11中全面加入了列表初始化的功能,包括对vector,map,值类型,struct等等都可以使用列表初始化,还可以在函数中返回一个花括号括起来的列表,而在这之前我们只能对数组进行列表初始化:


//数组列表初始化
int xx[5]={1,2,3,4,5};
int yy[]={6,7,8,9,0};
 
//值类型进行初始化
int a{10};
int b={10};
int c={10.123}; // 编译器报错,g++ 5.3.1当列表初始化用于值类型的时候,如果有精度损失,编译器会报错。
 
//列表初始化还可以用结构体
typedef struct Str{
  int x;
  int y;
}Str;
Str s = {10,20};
 
//列表初始化类,必须是public成员,如果含有私有成员会失败
class Cls{
public:
  int x;
  int y;
};
Cls c = {10,20};
 
//vector不仅可以使用列表初始化,还可以使用列表进行赋值,数组不能用列表赋值
vector<int>v1={1,2,3,4,5,6,7,8,9}; // 初始化
vector<int>v2;
v2={3,4,5,6,7}; //赋值
 
//map列表初始化
map<string ,int> m = {
   {"x",1},
   {"y",2},
   {"z",3}
};
 
//用函数返回初始化列表只展示关键代码,相关头文件自行添加
//同理结构体,类,map的返回也可以使用初始化列表返回
vector<int> getVector()
{
 return {1,2,3,4,5};
}
 
int main()
{
 vector<int> v = getVector();
 cout<<v[0]<<v[1]<<v.size()<<endl;
 return 0 ;
}