C++标准库2nd 学习摘要Chapter3(二)

来源:互联网 发布:淘宝优化关键词技巧 编辑:程序博客网 时间:2024/05/16 09:25

C++语言新特征

新C++11语言特征

1. 在模版表达式中的空格已经不需要了

 vector<list<int> > old_style_vecL;vector<list<int>>  new_style_vecL; //OK since C++11

2.nullptr 和 std::nullptr_t

   C++11让nullptr代替0或NULL来明确提出没有指向一个值,这并不与没有值等价,这个新特征能够使我们避免一些空指针被当作整型变量。eg:

 void f(int);void f(void*);f(0); // 调用 f(int)f(NULL); //调用 f(int)f(nullptr); //调用 f(void *)

3. auto 自动类型推断

   在C++11之前,类型推断主要用于容器类的迭代器类型名太长而做的推断,在C++11,自动推断更加普通,对基本类型、对象等都能做自动推断。需要注意的,做自动类型推断时,必需在声明时初始化。

 auto i = 42 ; // int 类型double f();auto d = f(); // double 类型//auto j; // ERROR 没有在声明时初始化static auto vat = 0.12; // OKauto l = [](int i) -> int {cout << i << endl; return i;}; //Lambda表达式类型推断


4. 通用变量初始化方法

   在C++11之前,变量初始化通常以括号、大括号、赋值操作符提供,也就是说,特定类型的初始化方法并不一定相同,不具有通用性

   在C++11,引入了通用的语法{},但使用通常有个限制:

   不能丢失精度赋值,如不能从double 转变成为 int 型,需要显示转换。这个特征会避免产生一些不兼        容的代码。

 int arr[] {1,2,3};vector<int> v{1,2,3};vector<string> strs{ "a", "b","c" };std::complex<double> c{2.0,3.0};int i ; // i有 未定义值int j{}; //j = 0int *p; // p有 未定义值int *q{}; // q = nullptrint x1(5.3); // C++11之前初始化中的一种,x1 = 5;int x2 = 5.3; // x2 = 5;//int x3{5.3} // ERROR ,C++11通用初始化不能丢失精度char c1{7}; //OKchar c2{9999}; //ERROR

   为了使用户定义的类型能够支持这种列表初始化,C++11引进了类模版std::initializer_list<>

class P{public:P(int,int);P(initializer_list<int>);         //explicit P(initializer_list<int>);};P p(77,5); // 调用P(int,int)P q{77,5}; // 调用 P(initializer_list<int>)P r{77,4,43}; // 调用 P(initializer_list<int>)P s = { 7, 5 }; // 调用 P(initializer_list<int>)//初始化列表也可以做为参数传递给函数void print(initializer_list<int> vals){    for (const int& ele : vals)        cout << ele << endl;}

   在上面的例子中,为了使初始化列表不能够转换成对象,也就是说,禁用表达式 P s = {7,5}; 需要启用关键字 explicit 在构造函数之前。使用了explicit 之后,同时也应该知道,对于下面代码是错误的。

void fp(const P& );fp({1,2,3}); // ERROR


0 0