c++11新特性有哪些

1. Lambda表达式

C++11新增了Lambda表达式,可以更方便地定义并使用匿名函数。

1.1 Lambda表达式语法

Lambda表达式的基本结构如下:

[capturer](parameters) mutable -> return_type{body}

其中,

capturer: 捕获列表,表示Lambda表达式可以使用的外部变量

parameters: 参数列表,表示Lambda函数的参数

mutable: 可选修饰符,表示是否可以修改capturer中的变量

return_type: 返回类型,表示Lambda函数返回值的类型

body: 函数体,表示Lambda函数要执行的代码

例如,定义一个Lambda表达式:

auto sum = [](int a, int b){return a + b;};

这个Lambda表达式接受两个int型参数,返回它们的和。

2. 自动类型推导

C++11对于变量的类型推导进行了扩展,可以使用auto关键字自动推导变量的类型。

2.1 auto类型推导的优点

使用auto关键字进行变量声明可以带来以下优点:

简化代码

增加可读性

方便迁移

例如:

auto i = 0;

这种方式甚至可以省略掉类型,让编译器自行检测:

auto i = 5.5;

这样就可以省略掉类型声明double。

3. 数组和Vector初始化

C++11新增了更方便的数组和vector初始化方式,可以使用花括号来进行初始化。

3.1 初始化数组

使用花括号对数组进行初始化:

int arr[] = {1, 2, 3, 4, 5};

这样就可以方便地对数组进行初始化,让代码更加简洁易读。

3.2 初始化vector

使用花括号对vector进行初始化:

std::vector<int> vec{1, 2, 3, 4, 5};

这样就可以方便地对vector进行初始化,让代码更加简洁易读。

4. Range-based for循环

C++11新增了range-based for循环,可以更方便地遍历数组、容器等元素。

4.1 Range-based for循环的语法

Range-based for循环的基本语法如下:

for (variable : container) { statement }

其中,

variable: 用于遍历container中元素的变量

container: 要遍历的容器

statement: 要执行的代码

例如,使用range-based for循环遍历数组:

int arr[] = {1, 2, 3, 4, 5};

for (int i : arr) {

std::cout << i << " ";

}

这个循环会依次输出1, 2, 3, 4, 5。

5. 智能指针

C++11新增了智能指针,可以解决内存管理问题。

5.1 shared_ptr

shared_ptr是一种智能指针,可以多个指针共享同一个对象。它会记录有多少个指针共享对象,当这个计数器归零时,它会自动销毁对象。

使用shared_ptr的示例如下:

auto shared = std::make_shared<int>();

std::shared_ptr<int> shared1 = shared;

std::shared_ptr<int> shared2 = shared;

std::cout << shared1.use_count() << std::endl; // output: 3

这段代码中,创建了一个shared_ptr<int>类型的智能指针shared,并赋值给了两个新的智能指针shared1和shared2。use_count()函数可以获取指向同一对象的shared_ptr数量。

5.2 unique_ptr

unique_ptr也是一种智能指针,但是它是独占的,不能被共享。

使用unique_ptr的示例如下:

auto unique = std::make_unique<int>();

std::unique_ptr<int> unique1(std::move(unique));

std::cout << *unique1 << std::endl; // output: 0

std::cout << *unique << std::endl; // crash

这个示例中,创建了一个unique_ptr<int>类型的智能指针unique,并且将它的拥有权转移给了另一个unique_ptr<int>类型的智能指针unique1。因为unique_ptr是独占的,所以不能同时拥有多个unique_ptr指针指向同一个对象。

后端开发标签