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

怎么做公司官方网站企业网站设计模板

怎么做公司官方网站,企业网站设计模板,网页开发价格,成免费crm特色vip文章目录 前言一、右值引用是什么?那么,什么又是右值?右值引用 二、使用步骤和意义1.1.11.2 2.右值引用的最大意义2.1 完美转发2.2 万能折叠 前言 C11 是2011年对C这门语言发布的新标准,并且此次标准引入了十分多的新特性&#x…

文章目录

  • 前言
  • 一、右值引用是什么?
      • 那么,什么又是右值?
      • 右值引用
  • 二、使用步骤和意义
    • 1.
      • 1.1
      • 1.2
    • 2.右值引用的最大意义
      • 2.1 完美转发
      • 2.2 万能折叠


前言

C++11 是2011年对C++这门语言发布的新标准,并且此次标准引入了十分多的新特性,很大程度上优化且增加了C++语言的实用性,本章主要讲 C++11 新引用的右值引用。


一、右值引用是什么?

在从C语言进入到C++时,我们就已经开始接触到引用

int i = 0;
int& ir = i;

引用,在我们以往的理解就是给一个变量取别名,实际上我们也确实可以这么理解。

那么,什么又是右值?

这里就需要区分左值和右值的概念,这里就需要注意,许多刚接触到C++的初学者,可能只是片面的认为 在"=“左边的就是左值, 在”="右边的就是右值,而这种区分方式是严重错误的。

int i = 0;
const int i1 = 2;

那我们可以理解为具有常性不可更改的就是右值,可更改的就是左值吗? 也不行

其实区分左值还是右值很简单,就看它是否可以被取地址,可以被取地址的就是左值,不可以被取地址的就是右值。

int i = 0; 左值
const char c; 左值
double* d; 左值
string str; 左值
int& ii = i; 左值
以上都可以被取地址,所以都是左值

1; 右值
sizeof(int); sizeof(int)的返回值为右值
(x+y); 运算符的本质其实也是调用函数所以也是右值
int(1); 匿名对象也是右值
以上就是常见的右值

右值引用

左值引用 是 int& ii = i;
而C++新增加的右值引用是专门对于右值进行引用,使用&&

int a = 1, b = 2;
int&& i = 10;
int&& i1 = a+b;
int&& i2 = sizeof(a);

二、使用步骤和意义

1.

右值引用和左值引用其实都用共同的目的,那就是为了减少拷贝,在我们曾经模拟实现的string和vector中,我们为了减少拷贝,总是会去使用左值引用。

string代码如下(示例):

void Swap(string& str)
{::swap(_str, str._str);::swap(_size, str._size);::swap(_capacity, str._capacity);
}
string(const string& str) //拷贝构造:_str(nullptr), _capacity(0),_size(0)
{string tmp(str._str);Swap(tmp);
}

1.1

那么是不是左值引用就只能引用左值?

string(const string& str) //拷贝构造:_str(nullptr), _capacity(0),_size(0)
{string tmp(str._str);Swap(tmp);
}string str = string("hello world");

这里我们采用匿名对象来构造一个string,刚刚我们也说了,匿名对象也是右值,但是仍然可以走上面的拷贝构造,因为我们使用了const string& str,加了"const"这就使得我们的左值引用也可以引用右值。

而我们的右值引用是不可以引用左值的,大家可以自行尝试,编译器是会报错的。

1.2

综上述,既然我们的const 左值引用也可以去引用右值,那么右值引用的意义是不是就不大了?

2.右值引用的最大意义

我们先来看刚刚的示例代码

代码如下(示例):

string(const string& str) //拷贝构造:_str(nullptr), _capacity(0),_size(0)
{string tmp(str._str);  //这里发生了拷贝Swap(tmp);
}

即使我们采用左值引用,这里仍然会发生一次拷贝,而在某些容器例如vector下,拷贝的代价可能会十分巨大,而面对一些将亡值,拷贝的意义并不大,因为有更好的方式! 这个时候,右值引用就凸显出了它的作用!

		string(string&& str):_str(nullptr), _capacity(0), _size(0){Swap(str);}

因为在这种情况下,这里的str一定是一个右值中的将亡值,它的生命周期仅仅只是为了构造新的string,所以我们完全可以将其数据用过Swap掠夺过来,再让他自行析构,这就减少了一次拷贝,提高了程序的运行效率!

2.1 完美转发

关于右值引用还需要注意的是一旦使用了右值引用,那么就会改变其原有属性

int a = 1, b = 2;
int&& i = 10;
int&& i1 = a+b;
int&& i2 = sizeof(a);

就例如该上 这里的i,i1,i2都会因为右值引用改变右值属性,变为左值属性,并且你可以对它们的内存数据进行修改,这是因为这些右值数据被移动到了一个其他区域储存起来。

而C++11为了保持其原有的属性,提供了完美转发

std::forward(x);

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; }
// std::forward<T>(t)在传参的过程中保持了t的原生类型属性。
template<typename T> //万能折叠
void PerfectForward(T&& t)
{Fun(std::forward<T>(t));//完美转发
}

2.2 万能折叠

template<typename T> //万能折叠
void PerfectForward(T&& t)
{Fun(std::forward<T>(t));
}

通过这样的模版格式,来使得t做一个自动折叠的功能,如果传的是一个左值,那么就是用左值引用,如果是一个右值,就是右值引用。


http://www.yayakq.cn/news/206162/

相关文章:

  • 网站空间付款方式网站内置多语言
  • 响应式酒店网站模板win优化大师官网
  • 移动网站建站做网站优化常用工具
  • 唐汉网站建设wordpress侧边栏浮动
  • 宁波网站建设方案联系方式服务器维修
  • 网站的下拉列表怎么做海沧建设局网站
  • 网站建设需要的框架结构wordpress插件使用方法
  • 鹤山市住房和城乡建设局网站简述网站规划的一般步骤
  • 免费网站建设找云狄wordpress自定义页面分页
  • 临沂电商网站建设网站开发东莞
  • 网站怎么做浏览量才会多手机设计图制作软件app免费
  • asp在网站开发中起什么作用wordpress主题缩略图
  • 网站制作企业对比北京企业网站备案需要多久
  • 国内网站搭建googleplay商店
  • 注册公司网站优化百度百科
  • 阿里云做电脑网站公司变更登记申请书下载
  • 南沙网站制作网站开发建设技术特点
  • 营销网站建设都是专业技术人员建设局是个好单位吗
  • 做电影网站犯法吗怎样做阿里巴巴网站的店招
  • 雁塔区住房和城乡建设局网站专业培训大全
  • 华企网站建设推广优化口碑好的网站定制公司
  • 哪个网站教做西餐帝国 织梦 wordpress
  • 做的网站名留言板网站建设总结
  • 银川做网站的 公司有哪些阳春网站开发
  • ui设计 国外网站买过域名之前就可以做网站了吗?
  • 网站定制首页费用案例剖析网站
  • 工信部备案系统网站wordpress一个域名多个主题
  • 网站制作的语言免费国内linux服务器
  • 怎么做自己网站店名注册查询官网
  • 网站是如何建立的工业设计产品分析案例