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

原创 2016年05月30日 21:12:50
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 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

30分钟了解c++11新特性

  • 2015年09月21日 11:05
  • 159KB
  • 下载

C++:C++11新特性详解(1)

前言:虽然目前没有编译器能够完全实现C++11,但这并不意味着我们不需要了解,学习它。深入学习C++11,你会发现这根本就是一门新的语言,它解决了c++98中许多遗留下来的问题。早晚会有一天,C++1...
  • linwh8
  • linwh8
  • 2016年06月05日 23:28
  • 4387

C++primer中提到的C++11新特性总结

decltype自动类型推定。decltype接受一个表达式,返回表达式的类型。可以接受最高层的修饰符,比如:const  int i; decltype(i) c =  I; c 类型为const ...

【C++】C++11新特性 之 lambda表达式的使用

Cocos2dx 3.0 版本后加入了lambda表达式,或者说C++ 11终于引入了lambda表达式,那么,什么是lambda表达式呢? 例如调用中的std::sort,ISO C++ 98...
  • yhhwatl
  • yhhwatl
  • 2014年03月30日 11:41
  • 908

c++基础——c++11中的新特性

c++基础——c++11中的新特性

@C++11 的新特性 对C++技术格局的影响

C++ reference From Cppreference Jump to: navigation, search FAQ Language ...

@C++11 的新特性 对C++技术格局的影响

C++ reference From Cppreference Jump to: navigation, search FAQ Language Pr...
  • wpc320
  • wpc320
  • 2013年01月23日 14:23
  • 3366

A Morden C++ —— C++11新特性指南

A Morden C++ —— C++11新特性指南 by JOKER on 2013/10/14 不知不觉C++1x,也就是以前的C++0x已经基本达到工业使用的成熟度了,各个编译器的实...

C++ 学习笔记:C++11 新特性学习

C++11是曾经被叫做C++0x,是对目前 C++ 语言的扩展和修正,C++11 不仅包含核心语言的新机能,而且扩展了 C++ 的标准程序库(STL),并入了大部分的 C++ Technical Re...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++】了解C++11新特性
举报原因:
原因补充:

(最多只允许输入30个字)