C++进阶——C++11(part 1)

一、列表初始化(initializer_list)

1、initializer_list 的结构

C++进阶——C++11(part 1)_第1张图片

所以像 { 10, 20, 30 } 这种用大括号括起来的列表就是初始化列表。 

C++进阶——C++11(part 1)_第2张图片

 在 C++11 中,支持了用列表初始化来构造容器,因此我们都可以用 “{ }” 来进行初始化容器。

vector v = {1, 2, 3, 4, 5, 6};

二、变量类型推导:auto VS decltype

1、auto

auto 只能根据变量初始化表达式类型推导变量类型,换句话说,auto 使用的前提是必须要对 auto 类型的变量进行初始化,否则编译器无法推导出 auto 的类型。

auto i = 1; // 不报错
auto i; // 报错

2、decltype 

decltype 可以理解成是不用对变量进行初始化版的 auto。

// 推演表达式类型
int a = 10, b = 20;
decltype(a + b) c; // c 的实际类型为 int

// 推演函数返回值的类型
cout << typeid(decltype(GetMemory())).name() << endl;

三、默认成员函数控制

C++11 支持强制生成默认成员函数(构造函数、拷贝构造函数、析构函数、赋值重载函数、取地址符重载函数,const取地址重载函数)。如果我们想强制编译器生成默认成员函数,只需要在函数的参数列表后面加上 =default 修饰就可以了。

class A
{
public: 
    A(int a)
        :_a(a)
    {}
    
    A() = default; // 强制编译器生成构造函数

private:
    int _a;
};

同时,如果我们不想让编译器生成默认成员函数,只要在函数的参数列表后面加上 =delete 修饰就行了。

class A
{
    ~A() = delete; // 禁止编译器生成析构函数
    A& operator=(const A& a) = delete; // 禁止编译器生成赋值重载函数
};

你可能感兴趣的:(c++,开发语言)