【C++】11新特性

C++新特性主要包括包含语法改进和标准库扩充两个方面,主要包括以下11点:
语法的改进
(1)统一的初始化方法
(2)成员变量默认初始化
(3)auto关键字 用于定义变量,编译器可以自动判断的类型
(4)decltype 求表达式的类型
(5)智能指针 shared_ptr
(6)空指针 nullptr(原来NULL)
(7)基于范围的for循环
(8)右值引用和move语义 让程序员有意识减少进行深拷贝操作
标准库扩充
(9)无序容器(哈希表) 用法和功能同map一模一样,区别在于哈希表的效率更高
(10)正则表达式 可以认为正则表达式实质上是一个字符串,该字符串描述了一种特定模式的字符串
(11)Lambda表达式

1. 初始化方法

C++98/03 可以使用初始化列表(initializer list)进行初始化,但是只有数组可以。在C++11中,可以对所有内置类型,包括用户自定义的类型进行列表初始化。
具体原理:
C++11 新提供了一个对象 initialzer_list,本质就是将该对象中的值赋值到指定的对象中。例如在 string 类中:

string(initializer_list<char> il);

就有这样的构造函数。

2. 成员变量默认初始化

构建一个类的对象不需要用构造函数初始化成员变量。

3. auto关键字

用于定义的变量,编译器可以自动判断类型。前提是定义一个变量时对其进行初始化。

  1. auto 不能在函数的参数中使用。
  2. auto 不能作用于类的非静态成员变量。
  3. auto 关键字不能定义数组。
  4. auto 不能作用于模板参数
4. decltypde关键字

decltypde是不需要推导变量初始化的,根据的是表达式对变量的类型就行推导。

auto varname = value;
decltype(exp) varname = value;
decltype(10.8) x;  //x 被推导成了 double
5. 智能指针 shared_ptr

和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存。并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆内存才会被自动释放)。

6. 空指针 nullptr(原来NULL)

​ nullptr 是 nullptr_t 类型的右值常量,专用于初始化空类型指针。nullptr_t 是 C++11 新增加的数据类型,可称为“指针空值类型”。也就是说,nullpter 仅是该类型的一个实例对象(已经定义好,可以直接使用),如果需要我们完全定义出多个同 nullptr 完全一样的实例对象。值得一提的是,nullptr 可以被隐式转换成任意的指针类型。不同类型的指针变量都可以使用 nullptr 来初始化,编译器分别将 nullptr 隐式转换成 int、char 以及 double* 指针类型。另外,通过将指针初始化为 nullptr,可以很好地解决 NULL 遗留的问题。

8.右值引用和move语义

右值引用
​ C++98/03 标准中就有引用,使用 “&” 表示。但此种引用方式有一个缺陷,即正常情况下只能操作 C++ 中的左值,无法对右值添加引用。因此,C++98/03 标准中的引用又称为左值引用。注意,虽然 C++98/03 标准不支持为右值建立非常量左值引用,但允许使用常量左值引用操作右值。也就是说,常量左值引用既可以操作左值,也可以操作右值。

C++11 标准新引入了另一种引用方式,称为右值引用,用 “&&” 表示。需要注意的,和声明左值引用一样,右值引用也必须立即进行初始化操作,且只能使用右值进行初始化。

move语义

​move 本意为 “移动”,但该函数并不能移动任何数据,它的功能很简单,就是将某个左值强制转化为右值。基于 move() 函数特殊的功能,其常用于实现移动语义。

C++中四种类型转换分别为const_cast、static_cast、dynamic_cast、reinterpret_cast
四种转换功能分别如下:

1. const_cast: 将const变量转为非const
2. static_cast: 最常用,可以用于各种隐式转换,比如非const转const,static_cast可以用于类向上转换,但向下转换能成功但是不安全。
3. dynamic_cast: ​只能用于含有虚函数的类转换,用于类向上和向下转换
​向上转换:指子类向基类转换。
向下转换:指基类向子类转换。
​这两种转换,子类包含父类,当父类转换成子类时可能出现非法内存访问的问题。 dynamic_cast通过判断变量运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。dynamic_cast可以做类之间上下转换,转换的时候会进行类型检查,类型相等成功转换,类型不等转换失败。运用RTTI技术,RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。在c++层面主要体现在dynamic_cast和typeid,vs中虚函数表的-1位置存放了指向type_info的指针,对于存在虚函数的类型,dynamic_cast和typeid都会去查询type_info。
​ 4. reinterpret_cast: reinterpret_cast可以做任何类型的转换,不过不对转换结果保证,容易出问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值