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

C++高级篇学习笔记

文章目录


前言

本文记录C++一些面试难点问题剖析。


1. 左右值和右值引用的作用

  • 左值

可以在=左边,表达式结束后依然存在的持久对象,一般有名字,可以取地址。
 提示: 前置自加/自减 可以做左值;

  • 右值

在=右边,不能取地址,没有名字,临时对象。

提示: 后置自加自减 做右值

但是,右值分两种: 

纯右值:字面值,后置自增自减,算术表达式,返回非引用的函数调用

将亡值:与右值引用相关的表达式,。例如将要被移动的对象

右值引用:

语法:  数据类型 && 变量名= 右值  。就是给右值取个名字,但是右值引用本身变成了左值。

作用:1. 实现移动语义    2. 实现完美转发

左值引用:

例如:

        int a=0;

        int &b = a;  这是普通左值引用

        const int & c = 0; 这是常量左值引用,必须要有const,否则报错。

        所以常量左值引用可以接收常量右值,也就是字面值。

         

移动语义:

C++ 11实现移动语义来减少拷贝: 

对右值使用移动语义可以减少拷贝,对左值可以使用std::move将左值转义为右值。

完美转发:

  •  万能引用: T && ,以此为形参,可以接收左值和右值。 

提示: T&&必须这么写,也就是只能用在模板中。如果写成int &&做形参,那只能接收右值。

        对右值引用的两个规则中的第一个也同样影响了旧式的左值引用。回想在pre-11 C++时,对一个引用取引用是是不被允许的,比如A& &会导致一个编译器错误。相比之下,在C++11中,引入了如下所示的引用折叠规则(reference collapsing rules):

        1. A& &变成A&
        2. A& &&变成A&
        3. A&& &变成A&
        4. A&& &&变成A&&

  • 模板函数:std::forward<T>(参数),用于转发参数,如果参数是右值转发完是右值引用,如果是左值,则转发后是左值引用。

 C++11 forward完美转发_Barry__的博客-CSDN博客_c forward

 上述文章解释了完美转发的使用场景和更合理的解释。

2. 智能指针

  • unique_ptr

独占式拥有,保证同一时间只有一个智能指针指向该对象。

#include<iostream>
#include<memory>
using namespace std;
int main(){unique_ptr<int> up_x(new int(10));//unique_ptr<int> up_x2(up_x); //没有左值拷贝构造函数//unique_ptr<int> up_x2=up_x;  //没有左值拷贝构造函数unique_ptr<int> up_x2;//up_x2 = up_x;                //没有左值拷贝赋值运算符,因为已被deleteunique_ptr<int> up_x3(unique_ptr<int>(new int(9)));  //有右值拷贝构造up_x2 = std::move(up_x);//可以借助move将up_x赋值给up_x2.此操作完成后up-x不可用,有右值拷贝复制*up_x2 = 99;////*up_x = 22;return 0;
}

shared_ptr

多个智能指针共享指向一个对象,所指对象在最后一个引用被销毁时释放,

 可以使用make_shared函数通过构造函数传入普通指针,get函数获得普通指针。

  • 默认情况下,初始化智能指针的普通指针必须指向一个动态分配的内存,因为智能指针默认调用delete释放内存。但也可以将智能指针绑定到一个类类型但是必须正确定义它的析构函数。例如shared_ptr<T> p(q,d);d为自定义的析构函数对象。

注意事项:shared_ptr可以指向数组,但是需要自定义删除器

关于数组的使用和指派删除器:

        我们经常看到的例子都是单个对象,那数组是不是也可以像这样shared_ptr<int> sp(new int[10]);使用shread_ptr?

        这样是错误的。我们要使用shared_ptr管理数组的话,必须给其制定一个删除器(函数):

shared_ptr<int> sp(new int[10], [](int *p) {delete[] p; });

         这里的匿名函数即是删除器。
        如果没有提供删除器,这段代码就是未定义的。默认情况下,shared_ptr使用delete销毁它所指的对象。如果这个对象是个动态数组,对其使用delete所产生的问题和释放一个动态数组忘记加[]的后果相同。

  • 构造函数是explict的,所以不存在从内置指针到智能指针的隐式类型转换。因此必须使用直接初始化(显式)。

 share_ptr循环引用导致的内存泄漏:

#include<iostream>
#include<memory>
using namespace std;
namespace demo63  //演示智能指针循环引用的问题
{class P2;class P1{public:std::shared_ptr<P2> P2Ptr; //如果换成weak_ptr的就可以打破僵局P1() {cout << "hello P1" << endl;}~P1() {cout << "bye P1\n";}};class P2 {public:std::shared_ptr<P1> P1Ptr; //如果换成weak_ptr的就可以打破僵局P2() {cout << "hello P2\n";}~P2() {cout << "bye P2\n";}};
}
int main()
{using namespace demo63;//shared_ptr<int> sp();//shared_ptr<int> sp(new int[10], [](int *p) {delete[] p; });{shared_ptr<P1> p1p(new P1());cout << "p count :" << p1p.use_count() << endl;shared_ptr<P2> p2p(new P2());cout << "c count :" << p2p.use_count() << endl;p1p->P2Ptr = p2p;cout << "c count :" << p2p.use_count() << endl;p2p->P1Ptr = p1p;cout << "p count :" << p1p.use_count() << endl;}//退出循环后,p1p和p2p释放,他们只是指针而已,所以会调用一次智能指针的析构函数//当p1p要析构的时候,发现本身还被p2p->P1Ptr指着,所以对p2p()的引用只是减一,p1p就析构了,不存在了//当p2p要析构的时候,发现本身被先前p1p的P2Ptr指针引用这,所以,只是引用减一,然后p2p被销毁。//而此时,对象P2和P1都没有被释放,内部的P1Ptr指针和P2Ptr指针还在相互指向着对方。导致内存泄露return 0;
}

 PS D:\MyCode> cd "d:\MyCode\" ; if ($?) { g++ main.cpp -o main } ; if ($?) { .\main }
hello P1
p count :1
hello P2
c count :1
c count :2
p count :2

 weak_ptr:


 

 

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关文章:

C++高级篇学习笔记

文章目录 前言 本文记录C一些面试难点问题剖析。 1. 左右值和右值引用的作用 左值&#xff1a;可以在左边&#xff0c;表达式结束后依然存在的持久对象&#xff0c;一般有名字&#xff0c;可以取地址。 提示&#xff1a; 前置自加/自减 可以做左值&#xff1b; 右值在右边&a…...

gentoo基本安装过程

该文章是本人在gentoo官方安装文档的基础上简单总结的&#xff0c;也是本人自己实践过的&#xff0c;目前本人用的就是gentoo&#xff0c;对于真的需要安装gentoo的朋友&#xff0c;建议还是参考官方文档&#xff0c;说的比较详细&#xff0c;这个可以简单看看&#xff0c;可以…...

【LeetCode】1234. 替换子串得到平衡字符串

1234. 替换子串得到平衡字符串 题目描述 有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4 次&#xff0c;那么它就是一个「平衡字符串」。 给你一个这样的字符串 s&#xff0c;…...

[动手写操作系统]-01-开机运行系统

文章目录 **概念和目标**概念目标理论源码概念和目标 概念 assembler: 汇编程序BIOS: BIOS(Basic Input Output System,基本输入输出系统)是个可编程的微型操作系统,用于管理计算机中的软硬件,它控制着系统的启动,系统是如何连接外部设备,怎样响应,调整相应操作,都是…...

最长回文子序列问题

最长回文子序列问题 问题描述&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 注意是子序列而不是子…...

月薪11k!从财务专员到软件测试工程师,成都校区小哥哥用三个月实现转行换岗

好久没和大家分享学员的转行经历了&#xff0c;或许在一些人看来他们的故事与自己无关&#xff0c;但同样也能引起一些人的共鸣&#xff0c;可以帮助到那些陷于就业焦虑的同学找到目标和方向。相仿的年龄、相同的职业、相似的压力…在转行软件测试追求更好生活的路上&#xff0…...

Android 逆向工具大整理,碉堡了

文章目录jadx打开 gui 界面把安装包打开双击变量名和方法名可以高亮所有出现的地方**强大的搜索功能****搜索资源****查看 APK 签名****查看 APK dex 数&#xff0c;方法数****查看资源&#xff0c;配置清单****展开包名**查找方式引用反混淆导出 Gradle 工程导出反编译资源lib…...

二维数组的定义

1. 概念二维数组就是一种数组的数组&#xff0c;其本质上还是一个一维数组&#xff0c;只是它的数据元素又是一个一维数组。如果你对这个概念想象不出来&#xff0c;给大家举个栗子&#xff0c;相信吸烟的同学一下子就会明白。一根烟 一个变量一包烟 20根烟 一维数组一条烟 …...

SpringMVC--获取请求参数、域对象共享数据

SpringMVC获取请求参数 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请 求的请求报文的对象 RequestMapping("/testParam") public String testParam(HttpServletRequest request){S…...

2月13日,30秒知全网,精选7个热点

///深圳支持数字经济核心区试点&#xff0c;市民每月免费享有1T网络流量支持基础电信企业、广电企业及互联网企业加快推进全市内容分发网络&#xff08;CDN&#xff09;扩容及智能改造行动&#xff0c;优化和完善CDN节点部署&#xff0c;积极利用边缘计算技术&#xff0c;推动互…...

【C++设计模式】学习笔记(2):模式分类与模版方法 Template Method

目录 简介模式分类GOF-23 模式分类从封装变化角度对模式分类重构获得模式 Refactoring to Patterns重构关键技法“组件协作”模式Template Method 模式动机(Motivation)结构化软件设计流程面向对象软件设计流程早绑定与晚绑定模式的定义结构(Structure)要点总结结语简介 He…...

【Swift 60秒】92 - Nil coalescing

0x00 Lesson The nil coalescing operator unwraps an optional and returns the value inside if there is one. If there isn’t a value - if the optional was nil - then a default value is used instead. Either way, the result won’t be optional: it will either b…...

python pip安装的包的路径

以ubuntu为例从一个店家那里拿到的一个ubuntu环境中&#xff0c;同时安装了python3.6和python2.7&#xff0c;又安装了ros&#xff0c;最后pip安装包的位置很混乱&#xff0c;安装的包不知道安装在了哪里。使用vscode的时候需要代码提示&#xff0c;就得找到包的路径&#xff0…...

个人收藏学习

【默认收藏夹】 CompletableFuture使用详解&#xff08;全网看这一篇就行&#xff09; 从头开始学MySQL-------存储过程与存储函数&#xff08;4&#xff09; 聊聊支付流程的设计与实现逻辑 聊聊消息中心的设计与实现逻辑 SpringBoot2 整合JTA组件&#xff0c;多数据源事务管理…...

【C++】类和对象---需掌握的功能

目录1.初始化列表1.1构造函数赋值1.2初始化列表格式&#xff1a;编译器执行的顺序&#xff1a;特性&#xff1a;1.3explicit关键字类型替换过程多参数构造函数类型替换&#xff08;C11&#xff09;2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时…...

2.12、进程互斥的软件实现方法

学习提示: 理解各个算法的思想、原理结合上小节学习的 “实现互斥的四个逻辑部分”&#xff0c;重点理解各算法在进入区、退出区都做了什么分析各算法存在的缺陷&#xff08;结合 “实现互斥要遵循的四个原则” 进行分析&#xff09; 1、单标志法 算法思想&#xff1a;两个进…...

Java面试题-数据库

数据库相关 MySQL的索引使用 默认会有主键索引。 索引分类&#xff1a;单值索引、复合索引、唯一索引 详细文章 MySQL explain 分析 MySQL通过explain关键字分析SQL的执行计划。&#xff08;Oracle通过EXPLAIN PLAN FOR sql&#xff09; IDSELECT_TYPETABLEPARTITIONSTYPEPOSS…...

select 与 where、group by、order by、limit 子句执行优先级比较

当 select 和 其他三种语句的一者或者多者同时出现时&#xff0c;他们之间是存在执行先后顺序的。 他们的优先级顺序是&#xff1a;where > group by > select > order by > limit 目录 1、select 与 where 2、group by 与 where 、select 2、select 与 order…...

【Docker】用开源umami监控你的站点访问量

新年到&#xff0c;祝大家兔年吉祥&#xff01;&#x1f389; 1.介绍 umami是一个开源的站点访问量监看程序&#xff0c;其支持docker部署到自己的服务器上。相比较百度等收费的网站信息监看&#xff0c;这种方式对于小站长来说更加实惠一些 2.docker安装的坑 2.1 docker-co…...

java环境配置

java环境配置步骤下载jdk安装jdk配置环境变量通过控制台命令验证配置是否成功大功告成安装教程&#xff1a; https://blog.csdn.net/m0_37220730/article/details/103585266 下载jdk 若不理解JDK/JRE/JVM的关系&#xff0c;可以点此查看初识Java&#xff08;概念、版本迭代、…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...