C++ 11 常见新特性总结

可以说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新特性非常之多,一时无法全部囊括其中。后续有待更新

猜你喜欢

转载自blog.csdn.net/no_say_you_know/article/details/129564461