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

建设一个网站要多少钱seo 培训教程

建设一个网站要多少钱,seo 培训教程,淄博易宝网站建设,怎么把网站黑了文章首发公众号:iDoitnow 1. 左右值和左右值引用 什么是左值、右值呢?一种极不严谨的理解为:在赋值的时候,能够被放到等号左边的值为左值,放在右边的值为右值。例如: int sum(int x, int y){return x y;…

文章首发公众号:iDoitnow

1. 左右值和左右值引用

什么是左值、右值呢?一种极不严谨的理解为:在赋值的时候,能够被放到等号左边的值为左值,放在右边的值为右值。例如:

int sum(int x, int y){return x + y;}int a = 1;        //a为左值,常数1为右值
int b = a + a;    //b为左值,表达式a+a为右值
int c = sum(a, a);//c为左值,但函数sum(a, a)返回值为右值

通过上面的例子,常数a、表达式(a+a)和函数sum(a+a)返回值他们都是临时值,这些值都保存在寄存器中,无法取到他们的地址;而对于abc为具体的变量名,存储在内存中,可以取到其地址。因此一般情况下可以根据能否取到地址,来区分左值和右值。

在了解左值和右值之前,我们首先要知道表达式的概念:由运算符和运算对象构成的计算式(类似数学中的算术表达式)。表达式是可以求值的,因此根据表达式值的类别,可以对其进行分类(准确的来说,是表达式的结果的值类别,但我们一般不刻意区分表达式和表达式的求值结果,所以这里称“表达式的值类别”。),C++11之后将表达式定义了五种类型:

  • lvalue(Left-hand-side value,左值)

  • prvalue(Pure rvalue,纯右值)

  • xvalue(eXpiring value,将亡值)

  • rvalue(Right-hand-side value,右值)

  • glvalue(Generalized lvalue,泛左值)

它们之间的关系如下图所示:

value
glvalue
rvalue
lvalue
xvalue
prvalue

C++11中将表达式按值类别可以分为左值将亡值纯右值。其中,左值和将亡值合称为泛左值,纯右值和将亡值合称为右值。

随着移动语义(后面我们会详细介绍)引入到 C++11 之中,值类别被重新进行了定义,C++之父Bjarne Stroustrup在《“New” Value Terminology》中给出以区别表达式的两种独立的性质:

  • 拥有身份 (identity):可以确定表达式是否与另一表达式指代同一实体,例如通过比较它们所标识的对象或函数的(直接或间接获得的)地址;
  • 可被移动:移动构造函数、移动赋值运算符或实现了移动语义的其他函数重载能够绑定于这个表达式。

C++11 中:

  • 拥有身份且不可被移动的表达式被称作左值(lvalue)表达式;
  • 拥有身份且可被移动的表达式被称作将亡值 (xvalue)表达式;
  • 不拥有身份且可被移动的表达式被称作纯右值 (prvalue)表达式;

1.1 左值

一般情况下,左值我们可以简单地理解理解为:能够使用&取地址的表达式

常见的左值有:

  • 变量名
  • 函数名
  • 返回左值引用的函数调用
  • 前置自增/减的运算符链接的表达式(如++i/--i
  • 内置的赋值表达式(如a=b,a+=1
  • 字符串等。

:字符串是可以取地址的,因此字符串常量也属于左值】

1.2 纯右值

纯右值:表达式本身就是纯粹的字面值(如1ture1.0);或者,该表达式求值结果相当于一个字面值或一个不具名的临时对象。

常见的纯右值有:

  • 除字符串字面值以外的字面值
  • 返回非引用类型的函数调用
  • 后置自增/减的运算符链接的表达式(如i++/i--
  • 算术/逻辑/比较表达式(如a+ba&&ba==b
  • 取地址表达式(如&a

1.3 将亡值

将亡值是在C++11中引进来的,顾名思义,就即将销毁的东西。将亡值的产生与右值引用的产生而引起的,对于将亡值我们常用到的有:

  • 返回类型是右值引用的函数调用或重载运算符的表达式(如std::move(x)
  • 转换为右值引用的转换函数的调用表达式(如static<int&&>(a)

1.4 左右值引用

左值引用就是对左值的引用。它的形式如:T&,根据const属性可以分为两种:

  • const左值引用
  • 非const左值引用

例如:

int a = 1;
int& la = a;//la为a的左值引用(非const左值引用)
la = 2;//la为非const左值引用,可以修改它的值const int& c_la = a;//c_la为a的左值引用(const左值引用)
c_la = 2;//该语法错误,c_la为const左值引用,不可以修改它的值

右值引用就是对右值的引用,通过T&&来表示。右值的引用只能绑定到右值上。

2. 移动语义

在未出现右值引用之前,我们在函数调用传参的时候,在某些时候可以使用按引用传递参数,减少参数多的拷贝对资源的消耗,提高程序的运行效率。当我们在处理包含大量数据的对象时,移动语义显的尤为重要。

2.1 std::move

如何将一个左值转换为一个右值呢?C++11在头文件utility中声明了std::move()函数,该函数的作用就是类型转换,通过它,我们可以 把一个左值,将其标记为右值。move()不做任何资源转移的操作,只是产生一个将亡值表达式来标识参数x,其完全等同于static_cast<T&&>(x)。例如:

int a = 1;
int&& r_a = a; //错误,右值引用只能绑定到右值上,而a是一个左值
int&& r_a = std::move(b); //正确, std::move(a) 是一个右值,可以用右值引用绑定

2.2 移动构造函数

一个类 T 的首个形参是 T&&、const T&&volatile T&& const volatile T&&,且没有其他形参,或剩余形参都有默认值。

具体的形式如下:

T (T &&) //移动构造函数的典型声明形式
T (T &&) = default; //强制编译器生成移动构造函数。
T (T &&) = delete; //避免隐式生成移动构造函数。

示例:

#include <string>
#include <iostream>
#include <utility>class A
{private:std::string s;public:A(std::string str = "A()") : s(str) {std::cout<<s<<"的构造函数\n";}A(A&& o) : s(std::move(o.s)) {std::cout<<s<<"的移动构造函数\n";}~A(){std::cout<<s<<"的析构函数\n";} 
};A f(A a) { return a; }int main()
{A a1(f(A("a")));// 按值返回时,从函数形参移动构造它的目标A a2(std::move(a1));// 从亡值移动构造
}

2.3 移动赋值运算符

一个类 T 的移动赋值运算符是名为 operator=的非模板非静态成员函数,它接受恰好一个 T&&const T&&volatile T&& const volatile T&& 类型的形参。

具体的形式如下:

T & T ::operator= (T &&) //移动赋值运算符的典型声明
T & T ::operator= (T &&) = default; //强制编译器生成移动赋值运算符
T & T ::operator= (T &&) = delete; //避免隐式移动赋值

示例:

#include <string>
#include <iostream>
#include <utility>class A
{private:std::string s;public:A(std::string str = "A()") : s(str) {std::cout<<s<<"的构造函数\n";}~A(){std::cout<<s<<"的析构函数\n";}A& operator=(const A& other){s = other.s;std::cout << "复制赋值\n";return *this;}A& operator=(A&& other){s = std::move(other.s);std::cout << "移动赋值\n";return *this;}
};A f(A a) { return a; }int main()
{A a1("a1"), a2("a2");std::cout << "尝试从右值临时量移动赋值 A\n";a1 = f(A("a")); // 从右值临时量移动赋值std::cout << "尝试从亡值移动赋值 A\n";a2 = std::move(a1); // 从将亡值移动赋值
}

参考文献

C++ Primer Plus(第六版) - 第18章 探讨C++新标准
C++ 参考手册

http://www.tj-hxxt.cn/news/128168.html

相关文章:

  • 网站建设与维护 发票企业网站有什么
  • 网上做兼职网站有哪些工作朋友圈推广
  • 做外链选择那些网站知乎怎么申请关键词推广
  • wordpress清除所有评论seo服务外包客服
  • 长沙网站设计精选柚v米科技seo根据什么具体优化
  • 国家电网账号注册网站帐号是什么竞价托管就选微竞价
  • 网站开发公司兴田德润在那里广点通投放平台登录
  • 网站开发离线下载报表百度推广方案怎么写
  • 健康资讯网源码 养生保健网站源码(织梦dedecms5.7百度推广销售员的工作内容
  • 浙江华企做网站做营销策划的公司
  • wordpress 整站转移5118关键词挖掘工具
  • 郑州网站seo诊断seo自动优化软件安卓
  • 淄博五厘网络技术有限公司seo关键词快速排名前三位
  • 网站建设一般考虑哪些因素补肾壮阳吃什么药效果好
  • wordpress过滤器插件6泰州seo平台
  • 设计师常用网站广州谷歌seo
  • 防疫网站网页设计在线域名解析ip地址
  • 推广普通话内容100字seo是什么
  • 电话销售做网站认证整合营销
  • 外贸网站平台下载南京seo外包平台
  • 有个专门做任务赚钱的网站7月新闻大事件30条
  • 资阳网站建设提供搜索引擎优化公司
  • vue做门户网站用什么ui新闻实时报道
  • 做网站联盟要多少钱元搜索引擎有哪些
  • css网站欣赏网络优化大师手机版
  • 在线解压网站外包网络推广公司
  • 武汉网站优化价格厦门人才网唯一官网登录
  • 网站建设市场占有率宁波seo企业推广
  • 长沙网站推广免费学生网页制作成品
  • 仿所有网站发布任务注册app推广的平台