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++基础(插入1)——C++11新特性:右值引用移动语义完美转发
C++11新特性:3—— C++ decltype类型推导完全攻略