栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11 新特性

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11 新特性

目录

1 常用特性

1.1 新类型

1.2 初始化

(1)初始化列表

(2)防止缩窄转换

(3)std::initializer_list

1.3 声明

(1)auto

(2)decltype

(3)using =

(4)nullptr

(5)返回类型后置

1.4 智能指针


1 常用特性

1.1 新类型

整形

  • long long
  • unsigned long long

字符型

  • char16_t        支持16位字符表示
  • char32_t       支持32位字符表示

1.2 初始化

(1)初始化列表

扩大了使用 { } 初始化列表的应用范围,可以用于所有内置类型和用户定义的类型。

short words[5] {1,2,3,4,5};
int a = {3};

创建对象时可以利用 { } 括起来的列表调用构造函数。

(2)防止缩窄转换

利用初始化列表编译器可以防止进行缩窄转换,相较于之前的操作具有更好的安全性。

但是允许转换为更宽的类型。

(3)std::initializer_list

initializer_list可用作构造函数的参数,属于STL模板型,具有begin()和end()操作。

可以作为函数的参数(除了构造函数外还可以用于普通函数)。

// Constructor function
vector a{1, 2, 3};   //3 elements set to 1,2,3
// Function paraments of general function
int main() {
    double total = sum({1, 2, 3, 4});
}
double sum(std::initializer_list i) {
    // Here can use begin() and end() to operator ...
}

1.3 声明

(1)auto

自动类型推断

(2)decltype

将变量的类型声明为表达式的类型。

// a same type as x*y.
decltype (x*y) a;

(3)using =

别名创建和声明。

using 具有和 typedef 同样的作用,均可以对复杂的标志符创建较为简单的别名。且using可用于模板部分具体化,但typedef没有给作用。

typedef std::vector::iterator itType;
using itType = std::vector::iterator;
template
using arr = std::array;

// 旧语法的具体化模板
std::array a1;
std::array a2;

// 新语法模板具体化
arr a1;
arr a2;

(4)nullptr

nullptr表示空指针,不同于旧版本的NULL。

(5)返回类型后置
template
auto func(T t, U u) -> decltype(T*U)
{
    ... 返回类型为 T*U
}

可以有效解决当编译器刚开始遇到func时并没有局部变量T和U,所有不知道返回类型,在后面使用了返回类型后置和decltype之后可以有效的额解决该问题。

1.4 智能指针

unique_ptr

shared_ptr

weak_ptr

所有的智能指针均可以和STL的移动语义协同工作。

1.5 作用域内枚举

使用了 class 和 struct 定义。同时需要显式限定,避免冲突。

作用域内枚举可以在作用域内有相同的枚举子集,只要通过显式的限定就可以避免冲突,叫之前标准更加的灵活和安全。

1.6 类的修改 (1)显示构造函数转换

explicit用于禁止单参数构造函数导致的自动转换。

通过explicit修饰后只能显示转换(也就是构造函数只能传入和声明的参数类型一样的值)。

(2)类内成员初始化

新标准可以在类的内部对成员进行初始化(成员函数和成员变量)。

class TEST
{
    int var1 = 10;
    double var2 {124.23};
    int var3;
public:
    TEST() {}
    TEST(int s) : var3(s) {}
}
1.7 模板和STL的修改 (1)基于范围的for循环 (2)新的STL容器
  • forward_list        单向链表,list为双向链表
  • unordered_map
  • unordered_multimap
  • unordered_set
  • unordered_multiset
  • array        固定长度,不能修改容器的大小。
(3)新的STL方法
  • cbegin()       指向容器第一个元素的后面,视元素为const。
  • cend()
  • crbegin()
  • crend()
(4)valarray/export/尖括号 1.8 右值引用

传统引用称为左值引用,使得标识符关联到左值。左值是一个表示数据的额表达式,程序可以获取其地址,但是const修饰后,使得不能赋值,但是可以获取地址。

右值引用使用 && 表示,右值引用可以关联到右值,可以出现在赋值表达式右边,但不能对其应用地址运算符的值。右值包括字面常量、表达式及返回值的函数。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号