c++11--强枚举类型,智能指针

1.枚举
1.1. c++11之前的枚举
实例

#include <iostream>enum Type{ONE,TWO,THREE
};int main(){printf("sizeof_%d, ONE_%d\n", sizeof(ONE), ONE);return 0;
}

具备以下特点:
(1). 枚举值直接在父作用域可见。
(2). 枚举底层类型由编译器结合枚举成员数值自行决定。
(3). 枚举值支持隐式转换为整数类型。

称上述枚举为弱类型枚举。

1.2.c++的强类型枚举
实例

#include <iostream>enum Type{ONE,TWO,THREE
};enum class TypeNew : char{ONEN,TWON,THREEN
};int main(){printf("sizeof_%d, ONE_%d\n", sizeof(ONE), ONE);printf("sizeof_%d,ONE_%d\n", sizeof(TypeNew::ONEN), TypeNew::ONEN);return 0;
}

在这里插入图片描述
具备以下特点:
(1). 枚举值直接在父作用域不可见,需要通过形如上述TypeNew::ONEN的形式。
(2). 枚举底层类型默认由编译器结合枚举成员数值自行决定,但可在定义时指定,如上述TypeNew底层类型为char。
(3). 枚举值不支持隐式转换为整数类型。

称上述为强枚举类型。

1.3.c++11对原因弱枚举类型的增强
(1). 支持对弱类型枚举指定底层存储类型。
(2). 对弱枚举类型值在父作用域可见,但也可通过枚举名::枚举值形式的使用。

1.4.弱枚举类型和#define的差异

#include <iostream>#define ONE 1
enum type{ONE1
};int main(){ONE;ONE+1;//int ONE = 1;//int ONE1 = 11;printf("one1_%d\n", ONE1);return 0;
}

上述采用#define时,main中int ONE = 1;会报错。因为#define在预处理阶段执行简单替换。
上述采用enum时,main中int ONE1 = 11;不会报错,后续打印的ONE1为11。因为enum在编译阶段,编译器结合场景智能选择。

2.智能指针
2.1.unique_ptr
实例

#include <memory>
#include <iostream>
using namespace std;int main(){unique_ptr<int> up1(new int(11));//unique_ptr<int> up2 = up1;// errcout << *up1 << endl;unique_ptr<int> up3 = std::move(up1);cout << *up3 << endl;//cout << *up1 << endl;// errup3.reset();up1.reset();//cout << *up3 << endl;//errreturn 0;
}

(1). unique_ptr只支持移动拷贝构造,移动赋值。移动拷贝下,左边对象窃取右边对象资源。移动赋值下,左边对象先释放底层资源,再窃取右边对象资源。
(2). unique_ptr对象持有的资源被窃取后,后续不可再使用底层资源。
(3). 可使用reset显式释放底层资源。底层资源释放后,无法再使用。

unique_ptr一般用于只有一个持有者的资源的管理。

2.2.share_ptr
实例

#include <memory>
#include <iostream>
using namespace std;int main(){shared_ptr<int> sp1(new int(22));shared_ptr<int> sp2 = sp1;cout << *sp1 << endl;cout << *sp2 << endl;sp1.reset();cout << *sp2 << endl;return 0;
}

(1). shared_ptr支持普通拷贝构造,普通赋值。普通拷贝构造下,左边对象和右边对象共享同一底层对象。普通赋值下, 左边对象原来底层对象的引用数先减1,再和右边对象共享同一底层对象(递增右边对象底层对象的引用数)。
(2). shared_ptr支持移动拷贝构造,移动赋值。移动拷贝构造下,右边对象底层资源被窃取到左边。意味着,右边对象此后不可再访问底层资源。底层资源引用数并未增加和减少。移动赋值下,先递减原来持有的底层资源引用数,再窃取右边对象的底层资源。意味着,右边对象此后不可再访问底层资源。但底层资源引用数并未增加和减少。
(3). 底层对象被多个shared_ptr共享时,通过共享的任一shared_ptr均可访问底层资源。单个shared_ptr释放资源只使得底层资源引用数减去1,当底层资源引用数变为0时,才实际释放。

2.3.weak_ptr
实例

#include <memory>
#include <iostream>using namespace std;void Check(weak_ptr<int>& wp){shared_ptr<int> sp = wp.lock();if(sp != nullptr){cout << "still " << *sp << endl;}else{cout << "pointer is invalid." << endl;}
}int main(){shared_ptr<int> sp1(new int(22));shared_ptr<int> sp2 = sp1;weak_ptr<int> wp = sp1;cout << *sp1 << endl;cout << *sp2 << endl;Check(wp);sp1.reset();cout << *sp2 << endl;Check(wp);sp2.reset();Check(wp);return 0;
}

(1).可通过一个shared_ptr来构造一个weak_ptr。
(2).weak_ptr仅仅指向底层资源,但无需递增底层资源引用数。
(3).通过weak_ptr执行lock,在指向的底层资源存在下,返回一个shared_ptr。在指向的底层资源不存在下,返回nullptr。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫工作量由小到大的思维转变---<第二十二章 Scrapy开始很快,越来越慢(诊断篇)>

前言: 相信很多朋友在scrapy跑起来看到速度200/min开心的不得了;可是,越跑到后面,发现速度变成了10-/min;刚开始以为是ip代理的问题,结果根本不得法门... 新手跑3000 ~ 5000左右数据,我相信大多数人没有问题,也不会发现问题; 可一旦数据量上了10W,你是不是就能明显感觉到速度…

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置 一、编辑器模式下的PlayerPrefs存储位置1.Win r 输入regedit进入注册表界面2. HKEY_CURRENT_USER/Software/Unity3.CompanyName和ProjectName可以在Unity->Edit->Project Settings->Player中查看和设置 二、…

华为设备文件系统基础

华为网络设备的配置文件和VRP系统文件都保存在物理存储介质中&#xff0c;所以文件系统是VRP正常运行的基础。只有掌握了对文件系统的基本操作&#xff0c;网络工程师才能对设备的配置文件和VRP系统文件进行高效的管理。 基本查询命令 VRP基于文件系统来管理设备上的文件和目录…

【低照度图像增强系列(1)】传统方法(直方图、图像变换)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

【Spring实战】04 Lombok集成及常用注解

文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor&#xff0c;AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具&#xff0c;它通过注解的方式简化了 Java 代码的编写&…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知&#xff0c;接口ISchedulerListener&#xff0c;如作业的添加、删除、停止、挂起等事件通知&#xff0c;调度器的启动、关闭、出错等事件通知&#xff0c;触发器的暂停、挂起等事件通知&#xff0c;接口部分定义如下&#xff1a…

算数平均数、调和平均数、几何平均数的计算方法与应用场合

一 定义 1、算数平均数&#xff1a;又称均值&#xff0c;是统计学中最基本&#xff0c;最常用的一种平均指标&#xff0c;分为简单算术平均数、加权算术平均数。 2、调和平均数&#xff1a;又称倒数平均数&#xff0c;是总体各统计变量倒数的算数平均数的倒数。分为数学调和平…

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…

ubuntu22.04+ROS2推荐匹配的gazebo版本

放大以后看到&#xff1a; 可以看到ros2推荐使用版本是humble-----匹配的是Ubuntu22.04LTS -------匹配gazebo Harmonic

二叉树进阶题目(超详解)

文章目录 前言根据二叉树创建字符串题目分析写代码 二叉树的层序遍历题目分析 写代码二叉树的层序遍历II题目分析写代码 二叉树的最近公共祖先题目分析写代码时间复杂度 优化思路优化的代码 二叉搜索树与双向链表题目分析写代码 从前序与中序遍历序列构造二叉树题目分析写代码从…

每日一题——LeetCode860

个人方法&#xff1a; 用change数组保存我们拥有的零钱的数量&#xff0c;change数组只有change[5]、change[10]、change[20]是有效的&#xff0c;其值代表了不同面值的零钱拥有多少张 顾客付了多少钱&#xff0c;先把钱存入零钱数组&#xff0c;然后计算需要找零的金额&…

【计数DP】牛客小白月赛19

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先做法一定是计数 dp 然后状态设计&#xff0c;先设 dp[i] 然后看影响决策的因素&#xff1a;两边的火焰情况&#xff0c;那就 dp[i][0/1][0/1]表示 前 i 个&#xff0c;该位有无火焰&#xff0c;该位右边有无火焰的方案数…

【SpringBoot】之Security进阶使用(登陆授权)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Security系列》。&#x1f3af…

智能优化算法应用:基于天鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于天鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于天鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.天鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

如何通过UMC配置外围组件

随着云计算技术的不断发展&#xff0c;在信息化建设模式上云是大势所趋。对于企业而言&#xff0c;已建立的内部集成并不能支撑其快速搭建开发环境、快速部署集群服务&#xff0c;并且动态水平扩展对多组织情况许可费用高昂、没有敏捷快速迭代机制&#xff0c;导致开发完毕就落…

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备&#xff0c;它的内部是一个旋转编码器&#xff0c;知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备&#xff0c;最近前面板的MCU从MSP430切换成了STM32&#xff0c;因此我要将…

Could not resolve com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28.

1、首先进入阿里云maven仓库&#xff0c;在搜索栏输入无法下载的依赖名称&#xff0c;查询现有版本号&#xff0c;可以看到这里有2.9.34。 2、在build.gradle(Project)的buildscript闭包下替换为阿里云maven仓库&#xff1a; maven { url https://www.jitpack.io } maven { u…

基于 ACK One 实现简单的跨云协同,让业务管理更高效

作者&#xff1a;庄宇 本文根据 2023 云栖大会现场分享实录整理 2 年前的云栖大会&#xff0c;我们发布分布式云容器平台 ACK One&#xff0c;随着 2 年的发展&#xff0c;很高兴看到 ACK One 在混合云&#xff0c;分布式云领域帮助到越来越多的客户&#xff0c;今天给大家汇报…

中心性算法归纳

中心性算法不仅是在我所学习的计算机网络当中起很重要的作用&#xff0c;在交通网络、社交网络、信息网络、神经网络当中也有很多的应用例子。今天我在这里总结一下场景的几种中心性算法。 参考文献 Python NetworkX库 偏心中心性&#xff08;Eccentricity Centrality&#x…

银河麒麟v10 rpm安装包 安装mysql 8.35

银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突&#xff0c;因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…