C++11新特性总结

C++11新特性总结

final关键字

使派生类不可覆盖它所修饰的虚函数

override描述符

如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数

关于左值,右值

C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值

右值引用

左值是指可以出现在=左侧者,

右值是指只能出现在=右侧者

临时对象是个右值

右值引用与move语义的关系
  • 关联性: 右值引用是实现move语义的基础
  • 作用: 允许”偷取”临时对象的资源而非复制
  • 应用场景: 容器操作中大量临时对象的处理

移动语义

右值则临时对象

1
c.insert(ite,Vtype(buf));

左值则使用move关键字

1
2
M c1(c);
M c2(std::move(c1));
  • 核心机制
    • 当赋值右侧是右值时,左侧对象可直接”偷取”资源
    • 避免不必要的资源分配和拷贝
  • 实现要点
    • 类需要同时实现拷贝和移动语义版本
    • 移动操作后原对象应处于有效但未定义状态
    • 容器需要支持右值版本的插入操作
  • 注意事项
    • 被移动后的对象不应再使用
    • 移动构造函数应标记为noexcept
    • 临时对象自动被视为右值
  • 典型应用
    • 容器扩容时的元素迁移
    • 返回临时对象的优化
    • 明确不再使用的左值资源转移

应用

  1. 函数返回值优化
  2. STL 容器的高效插入与操作
  3. 动态资源管理(如智能指针)

完美转发