关闭

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

标签: c++c++11新特性c++11新特性
263人阅读 评论(0) 收藏 举报
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 ;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:51117次
    • 积分:641
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:6条
    最新评论