C++进阶之路《三》

一.右值

1.左值:可以对其进行取地址的值。等号左边的值,可以对其进行修改和赋值
2.右值:不能对其进行取地址(不可寻址)
如:字面常量,函数返回值(将亡值)。将亡值有可能是内置类型产生的,也有可能是自定义设计的将亡值
在这里插入图片描述
3.将亡值:介于左值和右值之间
在这里插入图片描述

使用右值引用的目的

C++对于内置类型有一套属于自己的处理规则
对于用户自己设计出来的类型也有一套处理规则。是和内置类型不一样的处理规则
在这里插入图片描述

  • 右值引用的引入就是为了处理自己设计的类型,如何来优化这些处理规则,使得代码更加优化,运行速度更加的快,尽量减少对内存的复制和拷贝。这就是右值引用的目的
    C++还有一种介于内置类型和自定义类型之间的类型,称为PDU类型。即就是拿结构体设计的类型
    在这里插入图片描述

class和struct的区别

class和struct都可以设计类型

  • 区别:
    语法规则下:class在默认情况下访问属性为私有;struct在默认情况下为公有
    本质区别:class设计的是一种类型,最终实例化出来的是一个对象,对象由2部分构成:属性和方法;struct设计时,要么只包含数据,作为数据的集合,不认为struct有构造函数,析构函数…此时他和内置类型是一致的,处理方式和内置类型一样(。要么只包含方法,没有任何数据成员,光有一堆的纯虚方法,此时就会把他当作接口来看待

二.运算符重载

1.何时以值返回何时以引用返回

进过该运算符操作之后若返回自身则以引用返回;若操作之后返回的是一个临时量或将亡值就以值返回

在这里插入图片描述

2.重载整型强转

将对象类型强转为整型数据
该重载函数没有返回值类型,返回值类型就是明确标识的int类型。加const目的是为了让普通对象和常对象都可以调用
在这里插入图片描述
在这里插入图片描述

3.重载()变成仿函数

在这里插入图片描述

4.用于智能指针的重载

将堆区空间的地址交给一个对象管理,对象死亡调用其析构函数就可以自动调用delete进行释放,不需要人为释放
在这里插入图片描述

*运算符重载

解引用运算符重载,返回对象本身
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

->运算符重载

指向运算符重载,返回对象地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.成员为内置类型和自定义类型的区别

进入构造函数之前就会先将成员创建出来
对于内置类型,在初始化列表和构造函数类别赋初值都一样
对于自定义类型区别很大:初始化列表中会直接调用该类型的构造函数进行构造;进入构造函数进行赋值就会先构造生成一个临时对象,临时对象给自定义类型对象赋值,后析构临时对象。开销较大

因此对于类的成员尽可能按照列表方式进行构建
在这里插入图片描述
在这里插入图片描述

类成员的构造顺序

成员的构造顺序是按照其设计顺序进行构建的。构建顺序和其参数列表的顺序无关
在这里插入图片描述

初始化列表

初始化列表只可以使用在构造函数和拷贝构造函数中。其余函数一律禁止使用列表方式进行初始化。
原因:
对象在生成初期会调用构造函数或拷贝构造函数进行初始化,此时对象已经构造完毕,成员也已经初始化完成。若调用其他函数依旧可以对对象的成员进行赋值,那么会造成二次构建。对象只能构建一次,对象里面的数据成员也只能构建一次。
在这里插入图片描述

四.移动构造与移动赋值

目的:

尽可能少的对堆区进行new和delete操作。只进行资源的转移,不进行内存的开辟和对象的构建,大大增加了代码执行效率

移动构造是特殊的专门构建将亡值对象的构造函数
移动构造的过程中把对象资源转移给不具名对象;移动赋值是将不具名对象的资源转移给需要赋值的对象。该过程中没有内存空间的申请与释放,也没有对象的构建与析构,有的只是资源的转移。

在这里插入图片描述

注意:此程序s1原本str指向的堆区空间并未释放,造成了内存泄漏。因此如何解决
方法一:先delete s1的资源后接收将亡值对象的资源
在这里插入图片描述
方法二:交换将亡值对象和s1对象的资源
在这里插入图片描述

注意:没有实现移动构造和移动赋值,也没有赋值运算符重载,即只有缺省的。此时若强行使用移动赋值则会进行浅赋值,即按位赋值
在这里插入图片描述

右值引用(&&)

右值引用只能引用不具有名字的实体。因此只能引用将亡值,右值和纯右值

  • 左值:有地址,变量生存期和名字生存期一样。可以使用普通引用来引用左值
  • 将亡值:函数表达式中产生的不具有名字的实体,该将亡值的生存期只在该表达式的调用过程中
  • 右值:不能取地址。因为右值没有名字。右值一旦被引用就具有了名字,那么该右值就变成了左值
    在这里插入图片描述
  • 纯右值:字面常量,如10,20

目的:

如何有效的利用内存空间,如何管理内存空间,在函数的返回过程中对动态内存空间的管理

C11标准引入右值引用,移动赋值,完美转发目的是为了让程序效率更高;其次在进行函数重载的时候,原来的C++标准是根据类型不一致来进行重载的,但是类型不一致的重载在遇到函数返回值为无名实体时无法做出函数重载的区分,于是C11加入左值,右值,将亡值的概念进一步区分函数重载的能力。单靠类型和类型的个数不足以分辨函数的调用规则,因此C11标准引入了新的函数重载的依赖方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值