C++11特性(一)

C++11

简介

C++11可以说是C语言演变成C++之后第二个重大的标准了,上一个重大的标准是C++98

C++11相较于C++98带来了数量非常非常多的变化,新特性,对C++03进行了很多修正,甚至让C++11变得很不“C++”

但是C++11能更好的用于系统开发和库开发,语法也更进一步泛化,简单化,稳定,安全

这里介绍一些比较实用的语法特性

统一的列表初始化

需要注意这里的列表初始化和类的初始化列表不要混淆

花括号初始化

在C++98中,我们可以使用花括号对数组和结构体进行统一的初始值的设定

struct S
{
    int _a;
    int _b;
};

int main()
{
    int arr[] = {1,2,3};
    int arr[5] = {0};
    S s = {1,2};
    return 0;
}

C++11就更像是把花括号括起来的数据作为了一种新的容器,把这种容器再作用于所有的内置类型和自定义类型的初始化,就像使用vector初始化list的感觉差不多,甚至更进一步,他支持省略等于号,也支持new出来的初始化,可以这样写

struct S
{
    int _a;
    int _b;
};

int main()
{
    int x1 = 1;
    int x2{2};
    
    int arr1[]{1,2,3};
    int arr[5]{0};
    S s{1,2};
    
    int* pa = new int[4]{0};
    
    return 0;
}

学过python的同学是不是感觉优点python那味了

std::initializer_list

实际上,花括号真的变成了一个容器,叫做initializer_list,也就是初始化列表

官方文档initializer_list

我们可以通过以下代码查看类型

int main()
{
    auto il = {1,2,3};
    cout<<typeid(il).name()<<endl;
    return 0;
}

就像我们之前讲的,花括号其实是一种容器,那么他其实就可以用作其他容器的初始化,也可以作为operator=的参数,也就是说,他支持了大括号赋值,那我们就可以写出下面的代码

int main()
{
    vector<int> v = {1,2,3,4};
    list<int> lt = {1,2};
    
    map<sting,string> dict = {{"morty","莫蒂"},{"rick","瑞克"}};
    v = {4,5,6};
    return 0;
}

声明

C++提供了很多简化声明的方式,尤其是在使用模板的情况,如果要全部写出来真的巨麻烦

auto

这里我们在之前介绍类和对象迭代器的部分也介绍了一点,但是也主要是C++11的介绍,实际上C++98就已经提出了auto但是用法不一样,而且已经舍弃掉了

目前C++11的用法就是可以自动推导类型,但是auto不能作为函数声明的关键字,不能取出目标的类型去声明新的对象

这里就引出了下一个关键字

decltype

decltype就是可以用于自动推导类型,并且本身可以取出这个类型去声明新的对象

使用方法如下

template<class T1, class T2>
void Func(T1 t1, T2 t2)
{
    decltype(t1*t2) ret = t1*t2;
    cout<<"ret的类型是"<<typeid(ret).name()<<endl;
}
int main()
{
    const int x = 114;
    double y = 5.14;
    
    Func(x,y);
    Func(y,'x');
    return 0;
}

nullptr

nullptr其实是从安全和清晰的角度提出的,专门用于表示空指针

因为NULL的本质是字面常量0,他既可以表示指针常量,也就是0x0000000这个地址,也可以表示整形常量0,这样就会导致一些问题了

范围for

我们在之前讲迭代器的时候也提出了范围for,一般都是和auto打配合的,也有过比较详细的解释

需要注意的是,这只是我们在写的时候可以比较简化,但本质上还是普通的for循环,只是劳烦编译器进行替换了

智能指针

这个一时半会也解释不清楚,我们会在后面出单独的文章进行讨论

STL的新东西

一个是array容器,这个玩意其实没什么人用,因为一般用C语言形式的数组或者vector都挺香的,提出这个算是弥补一下吧,一般容器有的他都有

第二个是forward_list,这个是实际的单链表,直译是前向链表,list是双链表,我们之前也有做过详细的解释和模拟实现了

第三个是unordered_map和unordered_set,也就是基于哈希实现的无序map和set,我们之前也详细解释和模拟实现

除此之外每个容器都加上了const迭代器,但其实意义不大,因为原本的迭代器其实就足够使用了

接下来就是我们的重头戏了,右值引用和移动语义、可变参数模板、lambda、包装器这些内容会在下一篇文章作为重点来介绍,线程库的相关内容需要在完成Linux部分的介绍之后再进行撰写

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栖林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值