C++11

C++11

{}初始化

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:

struct Point
{
     int _x;
     int _y;
};
int main()
{
     int array1[] = { 1, 2, 3, 4, 5 };
     int array2[5] = { 0 };
     Point p = { 1, 2 };
     return 0;
}

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自

定义的类型,使用初始化列表时,可添加等号(=),也可不添加。

struct Point
{
     int _x;
     int _y;
};
int main()
{
     int x1 = 1;
     int x2{ 2 };
     int array1[]{ 1, 2, 3, 4, 5 };
     int array2[5]{ 0 };
     Point p{ 1, 2 };
     // C++11中列表初始化也可以适用于new表达式中
     int* pa = new int[4]{ 0 };
     return 0;
}

创建对象时也可以使用列表初始化方式调用构造函数初始化

class Date
{
public:
     Date(int year, int month, int day)
     :_year(year)
     ,_month(month)
     ,_day(day)
     { }
private:
     int _year;
     int _month;
     int _day;
};
int main()
{
     Date d1(2022, 1, 1); // old style
     // C++11支持的列表初始化,这里会调用构造函数初始化
     Date d2{ 2022, 1, 2 };
     Date d3 = { 2022, 1, 3 };
     return 0;
}
std::initializer_list
int main()
{
     // the type of il is an initializer_list 
     auto il = { 10, 20, 30 };
     cout << typeid(il).name() << endl;
     return 0;
}

std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。

auto

C++11中auto废弃了原来的用法,将其用于是实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

decltype

关键字decltype将变量的类型声明为表达式指定的类型。

auto和decltype的区别是decltyoe可以初始化变量,而auto不能。

int x = 1;
double y = 2.2;
decltype (x * y) ret; //ret的类型是double
nullptr

表示空指针

范围for循环
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
for(int x : a)//遍历数组中的元素
{
    cout << x;
}
右值引用和移动语义

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们

之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义在const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

int main()
{
    // 以下的p、b、c、*p都是左值
    int* p = new int(0);
    int b = 1;
    const int c = 2;
    // 以下几个是对上面左值的左值引用
    int*& rp = p;
    int& rb = b;
    const int& rc = c;
    int& pvalue = *p;
    return 0;
}

右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引

用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能

取地址。右值引用就是对右值的引用,给右值取别名。

int main()
{
    double x = 1.1, y = 2.2;
    // 以下几个都是常见的右值
    10;
    x + y;
    fmin(x, y);
    // 以下几个都是对右值的右值引用
    int&& rr1 = 10;
    double&& rr2 = x + y;
    double&& rr3 = fmin(x, y);
    // 这里编译会报错:error C2106: “=”: 左操作数必须为左值
    10 = 1;
    x + y = 1;
    fmin(x, y) = 1;
    return 0;
}
  1. 左值引用只能引用左值,不能引用右值。
  2. 但是const左值引用既可引用左值,也可引用右值。
  3. 右值引用只能右值,不能引用左值。
  4. 但是右值引用可以move以后的左值。

右值引用的意义:增加了移动构造和移动赋值

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值