C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既有实践,并改进了对 C++ 程序员可⽤的抽象。在它最终由 ISO 在 2011 年 8 ⽉ 12 ⽇采纳前,⼈们曾使⽤名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。
一.列表初始化:C++11中的{} • C++11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 • 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最后优化了以后变成直接构造。 下面举例:
c++支持的:
内置类型支持
int x1 = { 2 };
自定义类型也可以用列表初始化
没有实现拷贝构造
Date d1 = { 2025,1,1 };
const Date& d2 = { 2024,7,25 };
可以省略=
Date dd1{ 2025,1,1 };
const Date& dd2{ 2024,7,25 };
构造+拷贝构造+优化
vector
二.右值引用和移动语义:
左值是表示数据的表达式,一般具有持久状态,可以取地址,可以出现在赋值符号左边或者右边 右值也可以是数据的表达式,不能取地址,可以出现在赋值符号右边,但是不能出现在右边。 左值:是一个表达式,可以获取它的地址(最终特点)
常见的左值p,b,c,s,s[0]
int* p = new int(0);
int b = 1;
const int c = b;
*p = 10;
string s(“11111”);
s[0] = ‘x’;
int*& x = p;//左值引用给左值起别名
右值:
10;
x+y
fmin(x,y)
string(11111)
左值引用和右值引用: Type& r1 = x; Type&& rr1 = y; 第一个是左值引用。 第二个是右值引用。 左值引⽤不能直接引⽤右值,但是const左值引⽤可以引⽤右值 右值引⽤不能直接引⽤左值,但是右值引⽤可以引⽤move(左值)如: 左值引用不能直接引用右值,const左值可以引用右值
例:func(const T&x)可以传左值也可以传右值
const int& rx1 = 10;
const double& rx2 = x + y;
const string&rx4=string(“11111”);
右值引用不能直接引用左值,但右值引用可以使用move(左值)
int&& rrx1 = move(b);
cout << rrx1 << endl;
move:底层本质就是强转,将左值转化为右值
左值/右值引用属性是左值
rr1属性是左值,所以不能被move绑定,除非move一下
左值引用和右值引用的生命周期
例:func(const T&x)可以传左值也可以传右值 const 的左值引⽤也能延⻓临时对象⽣存期,但这些对象不能被修改
二.可变参数模版
template
可变参数模版,一个可变参数模版实例化出来多个不同参数个数的模版
包扩展
包的扩展: 这里介绍一种方法迭代法:
void ShowList()
{
// 编译器时递归的终⽌条件,参数包是0个时,直接匹配这个函数
cout << endl; } template
void ShowList(T x, Args… args)
{
cout << x << " "; // args是N个参数的参数包 // 调⽤ShowList,参数包的第⼀个传给x,剩下N-1传给第⼆个参数包 ShowList(args…); } // 编译时递归推导解析参数 template
void Print(Args… args)
{
ShowList(args…);
}
int main()
{
Print();
Print(1);
Print(1, string(“xxxxx”));
Print(1, string(“xxxxx”), 2.2);
return 0;
}
评论
还没有任何评论,你来说两句吧!