C++11新特性

一、c++11新特性
1、关键字:
(1)Auto
早期c/c++是具有自动存储期的局部变量;
在c++11中属于一个类型声明的占位符,同时auto声明的变量必须初始化,以便
编译器能通过初始化表达式推出其变量类型;
优点:
(1)在拥有初始化表达式的复杂类型变量时声明简化了代码
(2)避免了声明类型时发生的声明类型错误
(3)在C++中的一定程度能够支持泛型的编程,可以达到代码的跨平台效果
注意事项:
(1)auto声明的变量必须初始化
(2)auto不能同其他组合类型连用
(3)auto属于一个占位符,不属于类型,所以不能用于类型转换以及sizeof
(4)函数参数和模板参数不可以声明为auto类型
(5)auto会退化成指向数组的指针,除非被声明为引用
Int arr[10];
auto j = a;(typied(arr).name = int * )
auto k = &a;(typied(arr).name = int [] )
(6)auto作函数返回值,必须是用于定义函数,不能用于声明函数
(2)nullptr
使用nullptr代替NULL的原因:
(1)NULL在c中属于一个宏:#define NULL ((void*)0)
(2)C++中为了解决重载的问题,将NULL定义为0;
nullptr则是用于标识空指针,属于一个关键字,可以转化成任何指针类
型和bool类型,但不能用于转换成常数;
(3)引入nullptr是为了解决NULL在C++中不知道调用哪个函数的问题
Void Test(int a) void Test(int *a)
{ {
//调用的是NULL //调用的是nullptr
} }
(3)func: 用于获得当前函数名字符串的宏
const char * Stanard_Macros(void)
{
return func; //返回值:Stanard_Macros
}
(4)static_assert:
断言来解决问题,它支持两个参数输入,一个是返回bool型的表达式,另一个是警
告信息。
(5)final和override控制:
final用来限制基类虚函数的对应的派生类不能重写该虚函数,从而避免了某些接口被
重写覆盖;
override则指定了函数必须重载基类的虚函数,否则编译通不过,这就避免了某些输
入名或者原型不匹配等错误的发生
(6)for循环:基于范围的迭代写法
// & 启用了引用,改变后的vector中的遍历
for(auto &i : arr)
{
std::cout << i << std::endl;
}
2、初始化对象
C++11 提供了统一的语法来初始化任意的对象;
C++11 还把初始化列表的概念绑定到了类型上,并将其称之为 std::initializer_list,
允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普
通数组和 POD 的初始化方法提供了统一的桥梁。
#include <initializer_list>
class Magic {
public:
Magic(std::initializer_list list) {}
};
Magic magic = {1,2,3,4,5};
std::vector v = {1, 2, 3, 4};
3、Lambda 表达式,
实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但
是又不想费力去命名一个函数的情况下去使用的。//后续补充
4、STL容器
(1)Std::array
std::array 保存在栈内存中,相比堆内存中的 std::vector,我们能够灵活的访问这里面
的元素,从而获得更高的性能。
std::array 会在编译时创建一个固定大小的数组,std::array 不能够被隐式的转换成指
针,使用 std::array只需指定其类型和大小即可:
(2)std:forward_list
std::forward_list 是一个列表容器,使用方法和 std::list 基本类似。
和 std::list 的双向链表的实现不同,std::forward_list 使用单向链表进行实现,提供了
O(1) 复杂度的元素插入,不支持快速随机访问(这也是链表的特点),也是标准库容
器中唯一一个不提供 size() 方法的容器。当不需要双向迭代时,具有比 std::list 更高的
空间利用率。
5、多线程:
(1)std::thread:
解决了boost::thread中构成参数限制的问题
(2)std::atomic:
C++11中封装的原子数据类型(原子数据类型:不会发生数据竞争,能够直接使用在多线程中不需要加解锁的过程)
6、智能指针:后续有详细补充
(1)auto_ptr:有所有权唯一的问题
(2)unique_ptr:不能进行赋值拷贝的问题
(3)shared_ptr:引用了计数器,当为0时(即无对象引用这块内存时,释放掉这块
内存)
(4)weak_ptr:解决了shared_ptr中循环引用的问题,与shared_ptr搭配使用
部分内容参考自:
https://www.cnblogs.com/feng-sc/p/5710724.html
https://blog.csdn.net/jiange_zh/article/details/79356417

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值