C++了解C++11新特性

Posted 阶梯之上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++了解C++11新特性相关的知识,希望对你有一定的参考价值。

1、 列表初始化特点:当使用列表初始化时,且初始化存在信息丢失的风险时,编译器会报错。
int main()

     double num = 23.3245 ;
     int a =  num ;//使用列表初始化,编译器报错
     int a  num ; //使用列表初始化,编译器报错
     int a = num; //不报错,但数据会丢失。
     int a( num );//不报错,但数据会丢失。
     return 0 ;
2、初始化空指针可以用 nullprt
int main()

     int *p1 = nullptr; //c++11引入的初始化空指针的新方法
     int *p2 = 0 ;
     int *p3 = NULL ;
     return 0 ;

//在新标准下最好使用nullprt来初始化指针,同时尽量避免使用NULL
3、c++中有两种方式定义别名:一种是传统的typedef,第二种是 using
int main()

     typedef int base; //base就是int的别名
     typedef int *p ; //p是int*的别名
     using i = int;//i是int的别名
4、 auto说明符:让编译器自动帮我们分析表达式属于什么类型。
int main()

     auto a = "sadf" ;
     auto b = 1 ;
     auto c = 'c' ;

     auto d = 1,e = 1.1;//错误,类型不一致

     return 0 ;

//因为auto是让编译器去分析表达式所属类型,所以auto定义变量时必须赋值。

//auto会忽略顶层const,但底层const会被保留
//顶层const表示指针本身指向一个常数,底层const表示指针自己指向的对象是一个常数。
int main()

     int i = 0;
     const int val = 1;
     auto a = val;//a是一个int类型数,因为顶层被忽略了
     auto b = &val;//b是一个指向整数常量的指针,底层const被保留
     auto c = &i;//c是一个指向整数的指针
5、 decltype说明符:选择并返回操作数的数据类型,编译器分析表达式的类型,但不用计算它的值。
int main()

     const int i = 1 , & j = i,p = &i;
     decltype (i) a = 0 ; //a是const int类型
     decltype (j) b = a ;//b是const int&类型
     decltype (i) c; //错误,const 类型必须初始化
     decltype (j) d;//错误,引用类型必须初始化
     decltype (*p) e//错误,*p是解引用操作,得到的是引用类型,所以e是int&类型,必须初始化
     decltype (j + 0) f//正确,引用类型与int类型相加为int类型,所以f是一个未初始化的int类型
     return 0 ;

int a = 3,b = 4;
decltype (a = b) d = a;//赋值是会产生引用的表达式,所以d是int&类型,而由于编译器不会计算a=b的值,所以a的值不变

decltype((i)) g //错误,g是int&类型,必须初始化
decltype(i) h   //正确,e是一个没有被初始化的int类型
//注意:decltype((variable))(是双层或者多层括号)的结果永远都是引用类型,而decltype(variable)只有当variable本身是引用类型时,结果才是引用类型。
6、c++11可以为类数据成员提供一个数据初始值,创建对象时,如果数据成员没有初始化就会默认初始化。
struct Book

     std ::string bookNo;
     int sold ;
     double revenue ;
;
Book book;
//创建对象时:如果我们没有手动初始化,则会自动初始化,boolNo默认初始为空字符串,sold和revenue初始化为0
7、string的size操作返回的是string::size_type类型,它返回的是无符号类型,在c++11中可以用auto或者decltype来推断变量的类型
int main()

     auto len = line.size();//len的类型是size_type类型
     len = -1;//len会输出4294967295,这是由于len是一个无符号类型导致的。
8、for(range for)语句是c++中出现的新循环语句,他可以遍历给定序列中的每个元素。
int main()

     string s = "ASdfasdfsa sadf" ;
     for ( char c : s )
          cout << c << endl ;//打印s中每一个元素

     for ( char & c : s)//注意这里c是引用
          c = toupper (c);//如果要改变s中所有元素的值,就必须把循环变量定义成引用类型

     cout << s << endl ;//这里输出的是s中所有元素大写之后的值
     return 0 ;
9、在c++标准之前,如果vector的元素还是vector(或者其他模板类型),那么必须在右侧尖括号加个空格,而新标准则不需要。
vector<vector<int> >//旧标准
vector<vector<int>>//新标准
int main()

     vector <int > a =  1, 2 ,3 , 4 ; //c++11提供的新的列表初始化方法
     return 0 ;
10、若要得到const_iterator类型的迭代器类型,c++提供了新方法
vector <int > vInt ( 10, 1 );
     auto c = vInt .begin ();//得到的是vector<int>::iterator类型,可读可写
     auto d = vInt .end ();//得到的是vector<int>::interator类型,可读可写

     //下面代码是c++11提供的得到const_iterator类型的新方法
     auto e = vInt.cbengin ();//得到的是vector<int>::const_iterator类型,可读不可写
     auto f = vInt.cend ();//得到的是vector<int>::const_iterator类型,可读不可写
     return 0 ;
11、c++11提供了计算数组首指针和尾后指针的方法 :begin()和end()
int main()

     const int size = 10 ;
     int arr [ size] =  0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ;
     int *p = arr;
     int *pHead = begin( arr );//数组首地址,其结果等于p
     int *pEnd = end( arr );数组尾后最后一个元素的下一个元素的地址
     cout << p << " " << pHead << " " << pEnd << endl ;
     return 0 ;

以上是关于C++了解C++11新特性的主要内容,如果未能解决你的问题,请参考以下文章

C++:C++11新特性超详细版

从effective C++中窥探C++11特性

C++基础(插入1)——C++11新特性:右值引用移动语义完美转发

C++11新特性:3—— C++ decltype类型推导完全攻略

C++11新特性:3—— C++ decltype类型推导完全攻略

C++基础C++11的新特性