C++的新特性随着版本的更新不断引入,以下是对C++11至C++23中一些主要新特性的概述及简单举例:
C++11
-
自动类型推导(auto):编译器根据初始化表达式的类型自动推导变量的类型。
- 示例:
auto a = 10;
// 编译器会推导出a是int类型。
- 示例:
-
范围for循环(Range-based for loop):提供了一种更简洁、安全的遍历容器和数组的方式。
- 示例:
std::vector<int> numbers = {1, 2, 3, 4, 5}; for(int number : numbers) { std::cout << number << " "; }
- 示例:
-
智能指针(Smart pointers):如
std::unique_ptr
和std::shared_ptr
,自动管理内存生命周期,减少内存泄漏风险。- 示例:
std::shared_ptr<int> ptr = std::make_shared<int>(10);
- 示例:
-
Lambda表达式:允许在函数中定义匿名函数,简化函数对象的创建和使用。
- 示例:
auto func = [](int y) { return x + y; };
- 示例:
-
nullptr:引入
nullptr
关键字,代表空指针,替代了传统的NULL宏。- 示例:
int* ptr = nullptr;
- 示例:
-
右值引用和移动语义:通过右值引用(
&&
)和移动构造函数,实现资源的高效转移,避免不必要的拷贝操作。- 示例:
MyVector vec2 = std::move(vec1);
- 示例:
-
统一初始化(Uniform Initialization):使用花括号
{}
进行初始化,使初始化语法更加一致和简洁。- 示例:
int x{1};
- 示例:
C++14
-
泛型Lambda表达式:Lambda表达式可以使用
auto
关键字声明参数类型。- 示例:
auto func = [](auto y) { return x + y; };
- 示例:
-
返回类型推导:函数返回类型可以使用
auto
关键字进行推导。- 示例:
auto add(int a, int b) { return a + b; }
- 示例:
-
二进制字面量:使用前缀
0b
或0B
表示二进制数值。- 示例:
int binaryValue = 0b1010;
- 示例:
C++17
-
结构化绑定(Structured bindings):可以将元组或其他复合类型的成员绑定到命名变量。
- 示例:
auto [x, y] = std::make_pair(1, 2);
- 示例:
-
if constexpr语句:根据编译时条件选择性地编译不同代码块。
- 示例:
if constexpr (condition) { /* compile-time true branch */ } else { /* compile-time false branch */ }
- 示例:
-
折叠表达式(Fold expressions):简化了对参数包进行展开操作的语法。
- 示例:
auto sum = (args + ...);
- 示例:
C++20
-
概念(Concepts):用于对模板参数进行约束和限定,提供更清晰和可读性强的模板编程方式。
- 示例:
template<typename T> concept Integral = std::is_integral_v<T>;
- 示例:
-
协程(Coroutines):引入协程机制,简化异步编程。
- 示例:
std::generator<int> generate_numbers() { co_yield 1; co_yield 2; }
- 示例:
-
三向比较运算符(<=>):用于简化比较操作符的实现。
- 示例:
bool compare(const MyType& a, const MyType& b) { return a <=> b; }
- 示例:
-
范围(Ranges):提供了丰富的范围操作函数和算法,方便处理容器和范围。
- 示例:
auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });
- 示例:
C++23
-
新语言功能特性测试宏:用于检测编译器是否支持某些新特性。
-
显式对象形参:允许在成员函数定义中显式指定
*this
的类型。 -
if consteval / if not consteval:根据编译时条件选择性地编译consteval或非consteval代码块。
- 示例:
if consteval { /* compile-time code */ } else { /* runtime code */ }
- 示例:
-
多维下标运算符:允许使用多维下标访问容器元素。
- 示例:
v[1, 3, 7] = 42;
- 示例:
这些新特性极大地增强了C++的表达能力和编程效率,使得C++在现代软件开发中仍然保持着强大的竞争力。