可以说C++ 11 是全新的语言,因为它带来了很多的新特性,与C++98相比,完全像两个世界的产物,这里简要列出一些常见的特性。
关键字
auto
自动类型推导
auto a = 10; // 自动推导出a是int
decltype
推导表达式类型
int func() {
return 0;
}
decltype(func()) i; // i为int类型
nullptr
nullptr
是C++11引入用来表示空指针,建议使用nullptr
而不要使用NULL
,因为NULL
本质上是个int型的0,不是个指针。
int* p = nullptr;
default
如果需要默认的行为,可以用default
要求编译器生成构造函数。
default
即可和声明一起出现在类内部,也可作为定义出现在类的外部。在类内部默认是内联的。
class A {
A() = default;//用于声明构造函数为默认构造函数
~A() = default;
};
delete
阻止生成行为。delete
高数编译器,不希望定义这些成员。
class NoCopy{
NoCopy(const NoCopy&) = delete; //阻止拷贝
NoCopy &operator=(const NoCopy&) = delete; //阻止赋值
};
explicit
用于修饰构造函数,表示只能显式构造,不可以被隐式转换
class A {
explicit A(int value) {
cout << "value" << endl;
}
};
int main() {
A a = 1; // error,不可以隐式转换
A aa(2); // ok
return 0;
}
constexpr
用于常量表达式,编译时可以对函数或变量求值。定义constexpr函数有两项约定:函数返回类型及所有形参类型都得是字面值类型,且函数体中必须有且只有一条return语句
constexpr int new_sz() {
return 42; }
constexpr int foo = new_sz(); // foo是一个常量表达式
一个constexpr函数被隐式声明为内联函数
final
防止继承发生
class NoDerived final{
}; //不能作为基类
override
显式注明重载了虚函数
class Base {
virtual void func() {
cout << "base" << endl;
}
};
struct Derived : public Base{
void func() override {
// 确保func被重写
cout << "derived" << endl;
}
语法糖
列表初始化
int a{
};
class A {
public:
A(int) {
}
};
A c = {
123 };
A d{
123};
std::vector<int> func() {
return {
};
}
范围的for循环
vector<int> vec{
1, 2, 3};
for (int i : vec) {
cout << "i" << endl;
}
for(auto x:range)//拷贝了一份,可修改但不影响原数组
for(auto &x:range)//可以修改range的元素
for(const auto& x:range)//只读,不可修改
lambda 表达式
[capture] (parameters) -> return value { body }
auto func = [](int i){
return i * i;}
别名声明
typedef double D; //传统方式
using SI = Sales_item //C++11
新语义
右值引用
int &&t = 3;
移动语义 std::move
void func(int&& a)
{
cout << a << endl;
}
int a = 6;
func(std::move(a));
完美转发 std::forward
class Foo
{
public:
std::string member;
template<typename T>
Foo(T&& member): member{
std::forward<T>(member)} {
}
};
智能指针
- std::shared_ptr
- std::weak_ptr
- std::unique_ptr
库
时间库 chrono
线程库 thread
原子库 atomic
array
tuple
C++ 11新特性非常之多,一时无法全部囊括其中。后续有待更新