当前位置:首页C++ > 正文

C++11 支持的特性与语法大全

作者:野牛程序员:2026-01-27 12:57:17C++阅读 2011
C++11 支持的特性与语法大全

一、语言核心特性

1. 自动类型推导

  • auto 关键字让编译器根据初始化表达式自动推导变量类型。

auto x = 42;        // int
auto y = 3.14;      // double
auto str = "hello"; // const char*

2. 右值引用和移动语义

  • 右值引用 T&& 可以绑定临时对象,支持移动构造和移动赋值。

std::vector<int> v1 = {1,2,3};
std::vector<int> v2 = std::move(v1); // v1被移动
  • 配合 std::move()std::forward() 使用,提高性能,减少拷贝。


3. 统一初始化语法(列表初始化)

  • 使用 {} 初始化数组、容器、对象。

int a{5};
std::vector<int> v{1,2,3,4};
struct Point { int x, y; };
Point p{10, 20};

4. nullptr

  • 替代 NULL,类型安全。

int* p = nullptr;
if(p == nullptr) { /*...*/ }

5. 常量表达式

  • constexpr 声明编译期常量函数或变量。

constexpr int square(int x) { return x*x; }
constexpr int val = square(5);

6. 强类型枚举

  • enum class 防止枚举值冲突,类型安全。

enum class Color { Red, Green, Blue };
Color c = Color::Red;

7. 函数和 lambda 表达式

  • Lambda 支持匿名函数、捕获外部变量。

auto add = [](int a, int b){ return a + b; };
int result = add(2, 3);
  • 支持捕获方式:

int x = 10;
auto f = [x]() { return x + 1; };  // 值捕获
auto g = [&x]() { x++; };           // 引用捕获

8. 默认成员函数和删除函数

  • = default 用于显式生成默认构造、拷贝构造等

  • = delete 禁止某个函数

struct A {
    A() = default;
    A(const A&) = delete;
};

9. 尾返回类型

  • 使用 auto-> 指定返回类型。

auto add(int a, int b) -> int {
    return a + b;
}

10. 模板改进

  • 别名模板(alias template)

template<typename T>
using Vec = std::vector<T>;
Vec<int> v; // 等价 std::vector<int>
  • 可变参数模板

template<typename... Args>
void printAll(Args... args) { (std::cout << ... << args); }

11. 增强的类型检查

  • 类型推断和检查decltype 推导表达式类型。

int x = 42;
decltype(x) y = x; // y 类型为 int

12. 静态断言

  • static_assert 编译时断言

static_assert(sizeof(int) == 4, "int must be 4 bytes");

13. 右值引用与移动语义支持的标准库改进

  • std::move, std::forward, std::unique_ptr, std::shared_ptr


二、线程与并发特性

1. 多线程库

  • std::thread 创建线程

  • std::mutex, std::lock_guard 互斥

  • std::condition_variable 条件变量

  • 原子操作 std::atomic<T>

#include <thread>
#include <mutex>

std::mutex mtx;
void print(int i) {
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << i << std::endl;
}
std::thread t1(print, 1);

2. 线程局部存储

thread_local int counter = 0;

三、标准库改进(STL)

1. 智能指针

  • std::unique_ptr<T>, std::shared_ptr<T>, std::weak_ptr<T>

std::unique_ptr<int> p = std::make_unique<int>(5);

2. 数组和容器增强

  • std::array<T, N> 定长数组

  • std::unordered_map, std::unordered_set 哈希容器

3. 正则表达式

#include <regex>
std::regex r("\\d+");
std::smatch m;
std::regex_match("123", m, r);

4. 智能迭代器增强

  • std::begin, std::end, std::cbegin, std::cend

5. 新算法和函数

  • std::move, std::forward, std::to_string, std::stoi 系列


四、其他语法与特性

  1. 范围 for 循环

std::vector<int> v{1,2,3};
for(auto x : v) { std::cout << x << " "; }
  1. 字符串字面量

  • u8"", u"", U"",支持 UTF-8/16/32

  1. 原子类型和内存模型

  • std::atomic 提供原子操作

  • 内存序列化:memory_order_relaxed, memory_order_acquire

  1. 用户字面量

long double operator"" _km(long double x) { return x * 1000; }
auto distance = 1.5_km;

五、总结表格(核心特性)

特性类别特性示例/语法说明
自动类型auto x = 10;类型自动推导
nullptrint* p = nullptr;类型安全空指针
Lambda[x](int y){ return x+y; };匿名函数
右值引用T&&, std::move()移动语义
强类型枚举enum class Color{}类型安全枚举
静态断言static_assert(cond, "msg")编译时断言
尾返回类型auto f() -> int指定返回类型
统一初始化int a{5};初始化列表
智能指针std::unique_ptr, std::shared_ptr自动管理内存
线程库std::thread, std::mutex多线程支持
正则表达式std::regex字符串模式匹配
范围 forfor(auto x: v)遍历容器简化
constexprconstexpr int sq(int x)编译期常量
可变参数模板template<typename... Args>支持任意参数模板
用户字面量1.0_km自定义常量单位

C++11 特性语法对照表

类别特性语法示例说明注意事项
类型推导自动类型推导auto x = 42;编译器根据初始化表达式推导类型初始化必须存在,否则报错
空指针nullptrint* p = nullptr;替代 NULL,类型安全不能直接赋值为整型
Lambda匿名函数auto f = [](int a,int b){ return a+b; };支持捕获外部变量捕获引用需注意生命周期
右值引用移动语义T&& t = std::move(obj);避免不必要拷贝,提高性能被移动对象状态不确定,不可再用原值
强类型枚举enum classenum class Color{Red, Green};类型安全,防止命名冲突需要用 Color::Red 访问
静态断言static_assertstatic_assert(sizeof(int)==4,"error");编译期检查条件条件必须是编译期可计算
尾返回类型auto + ->auto f() -> int { return 1; }指定函数返回类型主要用于复杂类型推导或模板
统一初始化列表初始化int a{5}; std::vector<int> v{1,2,3};支持数组、对象、容器初始化防止窄化转换(narrowing)
智能指针unique_ptr/shared_ptrstd::unique_ptr<int> p = std::make_unique<int>(5);自动管理内存,减少内存泄漏注意循环引用问题(shared_ptr + weak_ptr)
多线程thread/mutex/condition_variablestd::thread t(func); std::mutex m; std::lock_guard<std::mutex> lock(m);提供跨平台多线程支持注意线程同步和资源保护
范围 forrange-based forfor(auto x:v) {}遍历容器简化对容器修改需用引用 auto& x
constexpr编译期常量constexpr int sq(int x){return x*x;}常量表达式在编译期求值函数体必须只有返回表达式,不允许复杂语句
模板改进别名模板template<typename T> using Vec=std::vector<T>;模板类型重命名可提高代码可读性
模板改进可变参数模板template<typename... Args> void f(Args... args){}支持任意数量模板参数递归展开或折叠表达式实现操作
用户字面量自定义单位long double operator"" _km(long double x){return x*1000;}支持语义化常量后缀字母需 _ 开头
正则表达式std::regexstd::regex r("\\d+"); std::regex_match("123", m, r);支持字符串模式匹配注意性能问题
数组容器std::array/unordered_map/setstd::array<int,3> a = {1,2,3}; std::unordered_map<int,int> m;提供固定长度数组和哈希容器std::array 容量固定,unordered 容器无序
原子操作std::atomicstd::atomic<int> a(0); a++;线程安全的基本类型操作对复杂对象需保证原子性或加锁
字符串字面量UTF-8/16/32u8"utf8", u"utf16", U"utf32"支持多字节字符集注意编码转换
右值引用辅助std::move/std::forwardstd::move(obj), std::forward<T>(x)支持完美转发和移动语义误用可能破坏对象状态

核心特点总结

  1. 语法简化auto、范围 for、统一初始化、尾返回类型

  2. 类型安全nullptr、强类型枚举、静态断言

  3. 性能优化:右值引用、移动语义、智能指针

  4. 模板增强:可变参数模板、别名模板

  5. 多线程支持std::threadstd::mutexstd::atomic

  6. 现代库支持std::regexstd::arrayunordered_map/set

  7. 编译期求值constexpr、静态断言


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • C++11 支持的特性与语法大全
  • 相关推荐

    最新推荐

    热门点击