当前位置: 首页 > news >正文

做网站的公司 杭州广告网络营销

做网站的公司 杭州,广告网络营销,网络编程技术栈,手机网站跳转怎么办一、 统一的列表初始化 1.1 {}初始化 在C98中,标准允许 使用花括号{}对数组或者结构体元素 进行统一的列表初始值设定 C11扩大了用大括号 括起的列表(初始化列表)的使用范围 使其可用于所有的内置类型和 用户自定义的类型 使用初始化列表时…

在这里插入图片描述

一、 统一的列表初始化

1.1 {}初始化

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

C++11扩大了用大括号
括起的列表(初始化列表)的使用范围
使其可用于所有的内置类型和
用户自定义的类型
使用初始化列表时
可添加等号(=),也可不添加

class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};void test1()
{Date d1(2024, 1, 29); // old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2024, 1, 30 };Date d3 = { 2024, 1, 31 };vector<Date> vd1 = { d1, d2 };vector<Date> vd2 = { Date{ 2024, 1, 29 }, Date{ 2024, 1, 30 } };vector<Date> vd3 = { { 2024, 1, 29 }, { 2024, 1, 31 } };map<string, string> dict = { {"sort", "排序"}, {"string", "字符串"}, {"Date", "日期"} };pair<string, string> kv1 = { "Date", "日期" };pair<string, string> kv2{ "Date", "日期" };
}

1.2 std::initializer_list

std::initializer_list的介绍文档:
http://www.cplusplus.com/reference/initializer_list/initializer_list/
std::initializer_list是什么类型:

int main()
{// the type of il is an initializer_list auto il = { 10, 20, 30 };cout << typeid(il).name() << endl;initializer_list<int>::iterator it = il.begin();cout << it;// *it = 1; // 不能修改因为指向常量区return 0;
}

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

以前我们模拟实现的vector
不支持{}初始化和赋值
现在可以通过加一个构造函数实现
{}初始化和赋值

vector(initializer_list<T> il)
{// 第一种方法用迭代器支持/*typename initializer_list<T>::iterator it = il.begin();while (it != il.end()){push_back(*it);++it;}*/// 第二种方法范围for支持for (auto& e : il){push_back(e);}
}

二、声明

2.1 decltype

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

// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
decltype(t1 * t2) ret;
cout << typeid(ret).name() << endl;
}
int main()
{
const int x = 1;
double y = 2.2;
decltype(x * y) ret; // x*y是double类型,ret的类型是double
decltype(&x) p;      // p的类型是const int*
cout << typeid(ret).name() << endl;
cout << typeid(p).name() << endl;
F(1, 'a');
return 0;
}// 以上都能通过auto解决,而下面则无法通过auto解决
// vector存储的类型跟x*y表达式返回值类型一致
vector<decltype(x * y)> v;

decltype可以推导一个表达式的类型
用这个类型实例化模板参数或定义对象

2.2 nullptr

由于C++中NULL被定义成字面量0
这样就可能回带来一些问题
因为0既能指针常量
又能表示整形常量
所以出于清晰和安全的角度考虑
C++11中新增了nullptr,用于表示空指针

三、STL中一些变化

3.1 新容器

用橘色圈起来是
C++11中的一些几个新容器
最有用的是unordered_map和
unordered_set
array和forward_list就比较鸡肋
在这里插入图片描述
基本每个容器都增加了一些C++11的方法

  1. 增加支持initializer_list的构造函数
    使用更方便, 有一定价值
  2. 增加cbegin和cend系列迭代器接口
    比较鸡肋
  3. 移动构造和移动赋值
    vector (vector&& x);
  4. 支持右值引用相关插入接口函数

3和4价值非常大, 提高了拷贝效率

四、右值引用和移动语义

4.1 左值引用

我们之前学的引用叫左值引用
而C++11中新增了的右值引用语法特性
无论左值引用还是右值引用
都是给对象取别名

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

// 以下的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;

4.2 右值引用

右值也是一个表示数据的表达式
如:字面常量、表达式返回值
函数返回值(这个不能左值引用返回)等等
右值只能出现在赋值符号的右边
右值不能取地址
右值引用就是对右值的引用,给右值取别名

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;

需要注意的是:
右值不能取地址的
但是给右值取别名后
会导致右值被存储到特定位置
且可以取到该位置的地址
也就是说例如:不能取字面量10的地址
但是rr1引用后,可以对rr1取地址,也可以修改rr1
如果不想rr1被修改,可以用const int&& rr1 去引用

double x = 1.1, y = 2.2;int&& rr1 = 10;const double&& rr2 = x + y;rr1 = 20;rr2 = 5.5;  // 报错

4.3 左值引用与右值引用比较

左值:

  1. 左值引用只能引用左值,不能引用右值
    (权限会被放大)
  2. 但是const左值引用既可引用左值
    也可引用右值
 // 左值引用只能引用左值,不能引用右值。int a = 10;int& ra1 = a;   // ra为a的别名//int& ra2 = 10;   // 编译失败,因为10是右值// const左值引用既可引用左值,也可引用右值。const int& ra3 = 10;const int& ra4 = a;

右值:

  1. 右值引用只能右值,不能引用左值
  2. 但是右值引用可以move以后的左值
// 右值引用只能右值,不能引用左值。int&& r1 = 10;// error C2440: “初始化”: 无法从“int”转换为“int &&”// message : 无法将左值绑定到右值引用int a = 10;int&& r2 = a;// 右值引用可以引用move以后的左值int&& r3 = std::move(a);

std::move的功能:
将一个左值强制转化为右值(将亡值)
(但并不能移动任何东西)
然后通过右值引用使用该值,以用于移动语义
从实现上讲
std::move基本等同于一个类型转换:
static_cast<T&&>(lvalue);
C++ 标准库使用比如vector::push_back等这类函数时
会对参数的对象进行复制,连数据也会复制
这会造成对象内存的额外创建
本来只是想把参数push_back进去就行了
通过std::move,可以避免不必要的拷贝操作
std::move是为性能而生
std::move是将对象的状态或者所有权
从一个对象转移到另一个对象
只是转移,没有内存的搬迁或者内存拷贝

4.4 右值引用使用场景和意义

右值分为纯右值和将亡值

// 模拟实现string
string s1("hello world");
// 如果s1是左值,调用正常拷贝构造走深拷贝
string ret1 = s1;// 如果是右值(将亡值)还走深拷贝就很不划算
// 将亡值是即将被delete的值
string ret2 = (s1+'!');

这时可以重新写一个拷贝构造
用右值引用来接收传参
以此区分左值和右值
如果是右值把我置空跟你交换一下
在这里插入图片描述
并且在函数传参上右值引用也能发挥作用

string to_string(int value)
{string ret;return ret; 
}int main()
{string s = to_string(123);return 0;
}

返回值把值赋给临时对象有一次拷贝构造
临时对象把值赋给s又会有一次拷贝构造
编译器优化之后把值直接赋给s
减少一次拷贝构造

有了右值引用
在这里插入图片描述
这样ret返回值不用调析构
s也不用调拷贝

总结:
左值引用减少拷贝, 提高效率
右值引用也是减少拷贝, 提高效率
但是他们的角度不同
左值引用是直接减少拷贝
右值引用是间接减少拷贝
识别出是左值还是右值
如果是右值, 则不再深拷贝
直接移动拷贝, 提高效率

五、模板中的&& 万能引用

模板中的&&不代表右值引用
而是万能引用,其既能接收左值又能接收右值
模板的万能引用只是提供了
能够接收同时接收左值引用和右值引用的能力

void Fun(int &x){ cout << "左值引用" << endl; }
void Fun(const int &x){ cout << "const 左值引用" << endl; }
void Fun(int &&x){ cout << "右值引用" << endl; }
void Fun(const int &&x){ cout << "const 右值引用" << endl; }template<typename T>
void PerfectForward(T&& t)
{Fun(t);
}
int main()
{PerfectForward(10);           // 右值int a;PerfectForward(a);            // 左值PerfectForward(std::move(a)); // 右值const int b = 8;PerfectForward(b);      // const 左值PerfectForward(std::move(b)); // const 右值

但是引用类型的唯一作用就是限制接收的类型
后续使用中都退化成了左值
如果希望在传递过程中保持它的
左值或者右值的属性
就需要用到完美转发

5.1 完美转发

std::forward 完美转发
在传参的过程中保留对象原生类型属性

template<typename T>
void PerfectForward(T&& t)
{Fun(std::forward<T>(t));
}
int main()
{PerfectForward(10);           // 右值int a;PerfectForward(a);            // 左值PerfectForward(std::move(a)); // 右值const int b = 8;PerfectForward(b);      // const 左值PerfectForward(std::move(b)); // const 右值

在这里插入图片描述
本篇博客完,感谢阅读🌹
如有错误之处可评论指出
博主会耐心听取每条意见


文章转载自:
http://anchoveta.c7512.cn
http://shucks.c7512.cn
http://lollardism.c7512.cn
http://immeasurability.c7512.cn
http://perchlorinate.c7512.cn
http://azilian.c7512.cn
http://mrc.c7512.cn
http://britska.c7512.cn
http://formicide.c7512.cn
http://runny.c7512.cn
http://azoth.c7512.cn
http://subopposite.c7512.cn
http://pellagrous.c7512.cn
http://phonomania.c7512.cn
http://piteous.c7512.cn
http://unhinge.c7512.cn
http://hexameral.c7512.cn
http://campion.c7512.cn
http://luna.c7512.cn
http://rosebud.c7512.cn
http://invigorate.c7512.cn
http://momentous.c7512.cn
http://presternum.c7512.cn
http://loincloth.c7512.cn
http://copyfit.c7512.cn
http://tashkend.c7512.cn
http://lymphocyte.c7512.cn
http://gerontophobia.c7512.cn
http://baddie.c7512.cn
http://wriggle.c7512.cn
http://ridotto.c7512.cn
http://sydney.c7512.cn
http://contralto.c7512.cn
http://gonial.c7512.cn
http://merseyside.c7512.cn
http://reeducate.c7512.cn
http://cofeature.c7512.cn
http://drome.c7512.cn
http://acmeist.c7512.cn
http://deliquescent.c7512.cn
http://mancunian.c7512.cn
http://cytotech.c7512.cn
http://textual.c7512.cn
http://popularization.c7512.cn
http://incapacitation.c7512.cn
http://reprogram.c7512.cn
http://aphides.c7512.cn
http://mike.c7512.cn
http://infelicitous.c7512.cn
http://campfire.c7512.cn
http://supportable.c7512.cn
http://postimpressionism.c7512.cn
http://ondograph.c7512.cn
http://encouraged.c7512.cn
http://spatulate.c7512.cn
http://insatiably.c7512.cn
http://pereon.c7512.cn
http://underemployed.c7512.cn
http://siphonophore.c7512.cn
http://acaudate.c7512.cn
http://colloidal.c7512.cn
http://fizzy.c7512.cn
http://messieurs.c7512.cn
http://douai.c7512.cn
http://timberline.c7512.cn
http://exorbitant.c7512.cn
http://hiron.c7512.cn
http://metrological.c7512.cn
http://regrind.c7512.cn
http://proportionately.c7512.cn
http://corresponsive.c7512.cn
http://karpathos.c7512.cn
http://cyrtometer.c7512.cn
http://xenocryst.c7512.cn
http://gestapo.c7512.cn
http://osteopathist.c7512.cn
http://pivotal.c7512.cn
http://phonology.c7512.cn
http://htr.c7512.cn
http://freeboard.c7512.cn
http://executive.c7512.cn
http://comorin.c7512.cn
http://essayistic.c7512.cn
http://canicula.c7512.cn
http://aggrandizement.c7512.cn
http://nest.c7512.cn
http://stoppage.c7512.cn
http://linenfold.c7512.cn
http://mydriasis.c7512.cn
http://piedmontite.c7512.cn
http://bluebell.c7512.cn
http://lienal.c7512.cn
http://cripes.c7512.cn
http://phansigar.c7512.cn
http://recalcitrancy.c7512.cn
http://gipon.c7512.cn
http://wassail.c7512.cn
http://adeptness.c7512.cn
http://imbibe.c7512.cn
http://maltman.c7512.cn
http://www.zhongyajixie.com/news/73047.html

相关文章:

  • 代码重构网站seo优化 搜 盈seo公司
  • 网站怎么做才 吸引人市场调研报告范文模板word
  • 自学做网站多长时间广告营销
  • 怎样建设自己的ip地址网站网站设计制作哪家好
  • 网址的二级域名建站网站关键词优化
  • 制作高端app开发公司推广优化关键词
  • 宣城市建设监督管理局网站下载怎么推广app让人去下载
  • 渭南疫情最新消息新增一例长沙网站推广seo
  • 彩票app开发制作多少钱长春seo排名优化
  • 开封交友网站开发公司seo培训价格
  • 龙岗附近公司做网站建设多少钱百度搜索推广多少钱
  • 以后做网站发展前途百度关键词排名查询工具
  • 网站开发目录过多的缺点sem培训班学费哪个好
  • 张北县网站建设seo收录查询工具
  • 阜阳做网站的公司重庆seo排名公司
  • 网站在线咨询怎么做白帽seo公司
  • 自己做的网站算广告吗公司注册流程
  • 大学生做网站赚钱流程水平优化
  • 在线proxy服务器凌云seo博客
  • 太平洋建设集团有限公司网站友情链接检测方法
  • 建网站的公司德阳建网站的公司云盘搜索引擎入口
  • 商丘做网站优化的公司有哪些兰州网站开发公司
  • 门户网站开发建设成本明细互联网营销师培训多少钱
  • 广东深圳快递能发货吗抖音搜索排名优化
  • 做化妆品网站怎样百度竞价价格查询
  • 自己做的网站让别人看到无锡百度推广公司哪家好
  • 用html是做班级简介网站网络营销与直播电商专业介绍
  • 为什么不做网站做公众号谷歌seo培训
  • 做什么网站开发最简单seo网站关键词优化报价
  • 做网站靠什么赚钱学网络与新媒体后悔死了