技术分享
🔥C++11
00 min
2024-9-30
2024-10-8
type
status
summary
date
slug
tags
category
icon
password
废话不多说,直接开始将C++11到底更新出来了哪些好用实用的特性吧
1.{}初始化
2.auto
auto其实是C++11里面定义出的非常有用的一个关键词,能自动的推断出需要定义的变量的类型
3.nullptr
nullptr弥补了之前NULL出现的问题(被定义为了整型的0)
4.for循环
在之前的文章中就有详细的讲解了,这里就不过多探究了
5.STL的一些微小变动
5.1 array
6.右值引用/左值引用
那到底什么事右值什么是左值呢
 
接下里就详细讲讲什么是左值引用和右值引用
右值引用不能直接给左值起别名,只能给move之后的左值起
左值引用也不能直接给右值起别名,但是可以在前面加一个const就能给右值起别名
左右值的区分其实就是能否取地址

使用场景和价值

其实在C++11中,左值引用和右值引用是为了更好地支持移动语义和完美转发而引入的特性。

左值引用(&

左值引用是C++98中就已经存在的引用类型,它可以绑定到任何可取地址的左值。

使用场景:

  1. 函数参数传递: 避免复制,提高性能。
  1. 返回局部变量的引用: 通常结合静态存储期变量使用。
  1. 操作符重载: 例如,重载赋值操作符时,通常使用左值引用来直接修改调用者。

价值:

  • 性能优化: 通过引用传递大对象或复杂对象,可以避免不必要的复制。
  • 接口简化: 引用可以使得函数接口更加简洁,不需要返回值。

右值引用(&&

右值引用是C++11中新增的特性,它只能绑定到右值,通常是临时的无名对象。

使用场景:

  1. 移动构造函数和移动赋值操作符: 允许资源从一个对象转移到另一个对象,而不是复制。
  1. 实现移动语义: 例如,在容器操作中,插入元素时,可以使用右值引用来避免不必要的元素复制。
  1. 完美转发: 在模板函数中,保持参数的左值或右值属性,转发给其他函数。

价值:

  • 性能提升: 对于包含大量资源的对象(如动态分配内存的字符串、容器等),使用右值引用可以显著减少复制操作,提高性能。
  • 资源管理: 更好地管理资源,尤其是那些不支持复制的资源。
  • 灵活的函数模板设计: 完美转发允许模板函数以透明的方式转发参数,增强了模板代码的复用性。
在这个例子中,createObject 函数返回一个临时对象,它是一个右值,因此在 MyClass obj1 = createObject(); 这行代码中,会调用移动构造函数而不是复制构造函数,从而提高了性能。
 
 

2.lambda表达式

 
语法:
Lambda 表达式是 C++11 引入的一项功能,它允许我们定义匿名函数,可以在需要的地方直接使用,而无需在类或命名空间范围内声明。以下是 lambda 表达式的一些底层常用用法:

1. 简单的临时函数

用于替代小的、一次性的函数。
auto add = [](int a, int b) { return a + b; }; int result = add(5, 3);

2. 在算法中使用

在标准库算法中,如 std::for_eachstd::find_ifstd::transform 等,lambda 表达式可以非常方便地作为谓词或操作。
std::vector<int> nums = {1, 2, 3, 4, 5}; int sum = 0; std::for_each(nums.begin(), nums.end(), [&sum](int n) { sum += n; });

3. 捕获局部变量

Lambda 表达式可以捕获其所在作用域内的局部变量。
  • 值捕获(默认情况下捕获的是值的副本)
  • 引用捕获(通过 & 前缀)
  • 隐式捕获(通过 = 或 & 表示值捕获或引用捕获,编译器自动推断捕获的变量)
int factor = 2; std::vector<int> nums = {1, 2, 3, 4, 5}; std::transform(nums.begin(), nums.end(), nums.begin(), [factor](int n) { return n * factor; });

4. 捕获 this 指针

在成员函数中,lambda 表达式可以捕获 this 指针,从而访问类的成员变量。
class MyClass { public: void doSomething() { int value = 42; auto lambda = [this, value]() { this->memberFunction(); // 访问成员函数 std::cout << value; // 使用捕获的局部变量 }; lambda(); } private: void memberFunction() { // ... } };

5. 作为回调函数

Lambda 表达式可以用于异步操作或其他需要回调函数的场景。
std::thread t([]() { std::cout << "Hello from thread!" << std::endl; }); t.join();

6. 在多态环境中使用

Lambda 表达式可以作为 std::function 或函数指针的替代品,用于多态环境中。
#include <functional> std::function<void()> func = []() { std::cout << "Polymorphic lambda" << std::endl; }; func();

7. 自定义操作符

Lambda 表达式可以定义操作符,这在某些算法中非常有用,比如排序。
std::vector<int> nums = {3, 1, 4, 1, 5, 9}; std::sort(nums.begin(), nums.end(), [](int a, int b) { return a < b; });
Lambda 表达式的引入极大地增强了 C++ 的表达能力,使得代码更加简洁和灵活。然而,过度使用或不当使用 lambda 表达式也可能导致代码可读性下降,因此需要谨慎使用。
 
 

3.可变模版参数

printf(”const char* format,…)
 
上一篇
大学日记
下一篇
python