十年磨一剑,时隔十年的C++11终于在今年发布了。在CSDN上看到《C++ Primer中文版(第5版)》马上要出版,连样章都发布了,于是粗略地翻了一下。样章只有前四章,加上水平有限,只看到新标准加入了很多新关键字,修改了旧标准的一些饱受诟病的地方,没看到我最关心的STL有无改进。等闲下来了再去仔细看吧,这里罗列了一下样章里的C++11新特性。
1、新定义了数据类型 long long
2、列表初始化——用花括号来初始化变量
C/C++ code?
1
|
vector<string> articles = { "a" , "an" , "the" }; |
3、右值引用
C/C++ code?
1
2
3
|
int ival = 1024; int &refVal = ival; // refVal 指向 ival (是 ival 的另名字) int &refVal2; //报错::引用必须被初始化 |
4、空指针关键字
得到空指针最直接的办法就是用字面值 nullptr 来初始化指针,这也是 C++11 新标准刚 刚引入的一种方法。
C/C++ code?
1
|
int *p1 = nullptr; // 等价于 int *p1 = 0; |
5、constexpr 类型
C++11 新标准规定,允许将变量声明为 constexpr 类型以便由编译器来验证变量的值是否是一个常量表达式。声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式初始化:
C/C++ code?
1
2
3
|
constexpr int mf = 20; // 20 是常量表达式 constexpr int limit = mf + 1; // mf + 1 是常量表达式 constexpr int sz = size () ; // 只有当 size 是constexpr函数才是一条正确的声明语句 |
6、auto 类型说明符
auto 让编译器通过初始值来推算变量的类型。
C/C++ code?
1
2
|
//由vail和val2相加的结果可以推断出item的类型 auto item = vail + va12; // item初始化为vail和val2相加的结果 |
7、decltype类型指示符
作用是选择并返回操作数的数据类型。
C/C++ code?
1
|
decltype (f()) sum = x; // sum的类型就是函数f的返回类型 |
8、类内初始值
创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将被默认初始化
9、范围for (range for)语句
C/C++ code?
1
2
|
for (auto c : str) //对于str中的每个字符 cout<<c<<endl; // 输出当前字符,后面紧跟一个换行符 |
10、两个新函数cbegin 和 cend
C/C++ code?
1
|
auto it3 =v.cbegin(); // it3 的类型是 vector<int>::const_iterator |
11、标准库函数 begin 和 end
C/C++ code?
1
2
3
|
int ia[] ={0,1,2,3,4,5,6,7,8,9}; // ia 是一个含有 10 个数的数组 int *beg =begin(ia); // 指向 ia 首元素的指针 int *last =end(ia); //指向 arr 尾元素的下一位置的指针 |
12、商一律向 0 取整(即直接切除小数部分)
C/C++ code?
1
|
21 % -5; /* 结果是 1 */ |
13、允许使用作用域运算符来获取类成员的大小
14、 vector<vector<int>>不用写成vector<vector<int> > 也对
个人以为C++11最好的改进点是引进了lambda,从此STL里的算法焕发了第二春
的确,这样使用std::sort就方便了很多