【C++11】部分特性

一.部分函数的使用

{ } 的初始化+使用explicit关键字禁止隐式类型转换

explicit的作用:

  • 拷贝初始化 = 号写法(会被 explicit 禁止)
  • 函数传参时的隐式转换(也会被禁止)
  • 返回值隐式构造临时对象(同样禁止)

initializer_list类型


说明:initializer_list对象是指向常量区数组的栈上轻量对象,编译器会把变量拷贝到常量区的数组,这个过程不会影响原来数组

  • 这个类内部含有const T* start,和const T* end ,分别指向常量区数组的开始和结尾
  • 本质调用initializer_list的构造函数

使用场景:

  • 作为构造函数的参数
  • 作为operator=的参数,便于用**{}**赋值

声明方式

复制代码
###### auto自动推导类型(得到的类型是字符串)
复制代码
*** ** * ** ***

###### decltype(将字符串化为可用)
  • 退出对象类型,再定义变量或者作为模板实参

此外,array类似静态数组,通过operator 对越界的检查严格,避免之前的指针解引用可能带来的越界访问

二.右值引用和移动语义

左值

概念:可以获取某个数据的地址的表达式(变量名或解引用的指针),使用const修饰后的左值不能赋值,但可以取地址。其中左值引用就是给左值取别名

  • 例如:

场景:做参数,返回值,目的:减少拷贝

  • 无优化时

传值返回,返回的s的拷贝,再用这个拷贝拷贝ret,编译器优化后在s销毁前拷贝给ret

  • 左值引用返回

右值

概念:可以表示数据的表达式(字面常量,表达式返回值,函数返回值<不能是左值引用返回)

  • 例如:

图中x+y返回临时变量具有常性

场景:左值右值作为参数,函数重载

  • 情景:在NRVO优化下,直接消除临时对象,直接在ret的位置构建对象,不需要拷贝构造
  • 情景:先默认构造再赋值重载

中间传值返回生成的第一个拷贝对象是右值对象,当右值对象是将亡值,使用移动拷贝,将右值的所有财产给ret,后面由ret处理其资源


编译器优化后:连续的构造、拷贝构造合成一个构造。将str识别为右值(将亡值)

传值返回编译器才识别成右值,func生成拷贝的临时对象具有常性,属于右值

传值返回+优化,将str识别成右值,ret2继承资源


左右值的互相引用
相关推荐
java资料站3 小时前
十一、评估测试
开发语言·人工智能·python
左手の明天3 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙3 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂4 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i4 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
狗凯之家源码网4 小时前
淘客口令落地页生成器 PHP 版深度评测
开发语言·php
画绛集美术4 小时前
本地化部署LLM用于美术史问答:一间美术教室的实践记录
开发语言·php
八解毒剂4 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
FakeOccupational5 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
打工仔折腾 AI5 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战