C++面向对象高级编程(I)侯捷 自我总结版

news2024/11/14 19:36:44

关键词: 类的防卫式声明,模版,内联函数,构造函数以及重载,const,pass by reference(有&符号),friend,操作符重载,返回local object的不能return by reference,拷贝构造函数,拷贝赋值函数(with self assignment),栈stack(装作用域内的东西,函数本体内),堆heap(装global东西的,new/delete),stack物体会自动清理,static物品在程序结束后清理,heap物品是在delete之后清理,new是先分配内存,再调用构造。delete事先调用析构,再释放内存。继承要用(non-virtual,virtual,pure-virtual)

防卫式声明
在这里插入图片描述模版
在这里插入图片描述
内联函数
在这里插入图片描述
构造函数
在这里插入图片描述构造函数重载(冲突例子)
在这里插入图片描述构造函数放到private区(不允许被外界创建对象的时候)
在这里插入图片描述接上:singleton(也是构造函数放到private了)
在这里插入图片描述const什么东西?不改变结果的就可以加上const 不动才可以const

下面这个:最好加上。
在这里插入图片描述參數傳遞:pass by value vs. pass by reference 引用黄色字
在这里插入图片描述上图,尽量都是传引用(&)。(速度很快)

返回值傳遞:return by value vs. return by reference (to const)
在这里插入图片描述也是,尽量return by reference。

friend友元。 朋友可以直接拿private里的东西
在这里插入图片描述相同 class 的各個 objects 互為 friends (友元)
在这里插入图片描述
上图,看起来好像打破了封装,func直接用了c1,但是确实可以,因为friends

操作符重载±(因为操作符也是函数)

在这里插入图片描述上图_doapl为什么? do assignment plus就是+=

傳遞者無需知道接收者是以 reference 形式接收
在这里插入图片描述
為了對付 client 的三種可能用法,這兒對應開發三個函數

在这里插入图片描述
下面這些函數絕不可 return by reference,(因为之前的是加到c2头上)

因為,它們返回的必定是個 local object.一定得return by value

简要理解:而这次是 一个返回临时变量local object,断不可return by reference

在这里插入图片描述反相函数开发
在这里插入图片描述
但是上图为什么第一个inline它不return by reference呢?所以这就是标准库没做的最优。标准库也不是圣经。

下面这个是看等不等
在这里插入图片描述共轭复数
在这里插入图片描述上图的operator <<就是重载了“<<”

所以cout<<c1<<conj(c1)会重载到cout身上,是global函数 有两个参数os和x

右边必须是复数,而且是引用速度快。传进来不改变加const。

cout是object,而他就是左边的参数os ostream类型这种type

而且不可以给ostream加const,因为每放进去一个东西,os的状态都在改变。

以上。

第一个例子(复数)的总结:

1.正规军写的构造函数:训练精良

构造函数:
complex(double r=0double i=0)

:re(r),im(i)

{}

2.函数该不该加const?如果这个函数不会改动数据,就要加上const

3.参数传递考虑pass by reference

4.return的时候也要return by reference

5.数据放在private中,函数绝大部分在public。
在这里插入图片描述上面两张图:为什么+=是成员函数,但是单+不是成员函数而是全局函数?

因为单+有可能加的是实数。所以设成全局函数。

并且加完之后的那个东西,是return by value。
在这里插入图片描述
上图是操作符重载“<<” 作用在ostream os身上

避免c1<<cout的写法!

拷贝构造函数,拷贝赋值。(类带着指针就要带着)

析构函数 ~String();

三个特殊函数:拷贝构造-拷贝赋值-析构函数

get_c_str()要带着const
在这里插入图片描述构造函数:包括两个情况。

~string析构函数:就是delete,防止内存泄漏。

s1和s2,s3可以自动调用析构函数
在这里插入图片描述
class with pointer members 必須有 copy ctor copy op=

如果不用拷贝构造和拷贝赋值:就会下图(浅拷贝):

浅拷贝的危害:内存泄露,以及alias了,两个人指向同一个内存。
在这里插入图片描述深拷贝:有拷贝构造和拷贝赋值
在这里插入图片描述上图:第一个string是类名,第二个string是构造,第三个string是返回自己。

就是————拷贝构造。

下图是:拷贝复制函数(有指针不能不写的函数)分三步走:
在这里插入图片描述
并且还要加上:检测自我赋值(因为自我赋值的第一步是杀掉自己):
在这里插入图片描述下图是output函数:
在这里插入图片描述Stack,是存在於某作用域 (scope) 的一塊內存空間(memory space)。例如當你調用函數,函數本身即會形成一個 stack 用來放置它所接收的參數,以及返回地址。下图的c1就是stack object。出了函数就不行。
在这里插入图片描述
内存泄漏:作用域结束,内存空间却还不回来,给不了任何人再次使用。

Heap,是指由操作系統提供的一塊 global 內存空間,程序可動態分配 (dynamic allocated) 從某中獲得若干區塊 (blocks)

動態分配所得的內存塊 (memory block), in VC

debug模式的复数:
在这里插入图片描述release模式的复数:
在这里插入图片描述
会发现,存两个位的复数,却用了64字节或16字节,因为有cookie(红色的)。
在这里插入图片描述下图:写一个string类,先想想用什么装string,一般是用指针,不用指定多大。

写构造函数

写big three:

拷贝构造(拷贝了他自己的)

拷贝赋值:只要不是local就可以reference(&)

析构函数

再来个char*

在这里插入图片描述然后写构造函数和析构函数 都是内联函数inline:
在这里插入图片描述然后是拷贝构造函数:

  • 浅拷贝:简单地复制对象的成员变量,包括指针。如果对象包含指向动态分配内存的指针,浅拷贝会导致多个对象共享相同的内存区域,这可能会导致资源管理上的问题,比如内存泄漏或数据不一致。
  • 深拷贝:为每个新对象分配独立的资源。如果对象包含指针,深拷贝会复制指针指向的数据,确保每个对象都有其独立的内存副本。
  • 在这里插入图片描述拷贝赋值函数:使用场景:
  1. 修改已存在的对象:当你需要将一个对象的状态复制到另一个已经存在的对象中时。
  2. 赋值操作:当使用赋值运算符 = 将一个对象赋值给另一个同名类型的已存在的对象时。
  3. 对象的自我赋值:当赋值操作可能涉及到自我赋值(即对象赋值给自己)时,拷贝赋值函数需要进行检查以避免错误。
  4. 先把目的端清空。
  5. 在这里插入图片描述static总结:静态

静态变量就是都认它,静态函数就是没有this指针
在这里插入图片描述例子:singleton 把构造函数以及拷贝构造弄到private中,别人没法创建对象,但是使用静态的a,public的get函数可以获得a。就创造了一个对象。
在这里插入图片描述改进:用mayers singleton 改进后。如果没有人用singleton。他就不存在。这就是节省。

在这里插入图片描述
cout总结:函数实现:
在这里插入图片描述
类模版:
在这里插入图片描述
函数模版:
在这里插入图片描述namespace:

using namespace std;被封锁在一个单元里;

面向对象编程中,“Composition”(组合)是一种设计原则,它指的是通过将一个对象包含在另一个对象中来实现两个对象之间的关联关系。组合是实现代码复用和灵活性的一种方式,它允许一个对象使用或操作另一个对象的功能。

组合与继承(一种"is-a"关系)不同,它是一种"has-a"关系。以下是组合的一些关键特点:

  1. "Has-a"关系
    • 当一个对象包含另一个对象时,我们说一个对象"拥有"另一个对象。例如,一个Car类可能包含一个Engine类的对象,表示汽车拥有一个引擎。
  2. 灵活性
    • 组合提供了更大的灵活性,因为它允许在运行时动态地替换组件。与继承相比,它不会导致类层次结构的紧密耦合。

继承inheritance(is-a):下面是_list_node是派生类,base是基类。public继承。派生类不仅有自己的,还有父类的。
在这里插入图片描述

构造要由内而外(从基类开始构造)

析构要由外而内(从派生类开始析构)
在这里插入图片描述上图中,我觉得ID不用子类来定义,所以non-virtual。

如果想让子类重新定义的东西,可以virtual

如果必须让自类重新定义,因为draw的每一个子类都不一样,所以直接纯虚。

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

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

相关文章

【LightGlue】lightglue performance

【LightGlue】lightglue performance 1. 图表分析2. 数据点解释3. LightGlue的细节4. 结论 这张图表展示了不同特征匹配方法在图像对每秒处理速度和相对位姿精度&#xff08;Relative Pose Accuracy&#xff09;之间的关系。 1. 图表分析 X轴&#xff08;横轴&#xff09;&…

使用 abortNavigation 阻止导航

title: 使用 abortNavigation 阻止导航 date: 2024/8/3 updated: 2024/8/3 author: cmdragon excerpt: 摘要&#xff1a;在Nuxt3中&#xff0c;abortNavigation是一个辅助函数&#xff0c;用于路由中间件内阻止不符合条件的页面访问&#xff0c;实现权限控制、错误处理及动态…

3条职场情商法则,让你少走弯路

人生的幸福和工作息息相关&#xff0c;它占据了大量时间&#xff0c;而时间是人生最珍贵的资源。但当年轻人从校园走进职场时&#xff0c;却常常面临困境。因为职场和学校是完全不同的场所&#xff0c;游戏规则大相径庭。 人们会惊奇地发现&#xff0c;曾经的学霸可能在职场中…

Qt 5.14安装(配置MSVC 2017)

Qt 5.14安装&#xff08;配置MSVC 2017&#xff09; 记录一下自己安装配置Qt的步骤。 我需要安装Qt&#xff0c;并使用MSVC编译&#xff0c;所以才写了这篇文章。 一、环境 操作系统&#xff1a;windows 11 &#xff08;64位&#xff09; Qt&#xff1a;Qt 5.14.2 vs&…

Linux 命令,touch说明与使用

1&#xff1a;touch命令功用&#xff1a; 对一个或多个文件,将访问时间和修改时间以及日期进行更新&#xff0c;既在 Linux 和 Unix 系统中&#xff0c;改变文件的访问和修改时间&#xff0c;touch对于强制其他的命令以某一方式处理文件时是有用的。如make的操作 和某些find命令…

LED显示屏的秘密:揭秘模拟信号与模拟电路

在我们日常生活中&#xff0c;LED显示屏无处不在&#xff0c;从商场的广告牌到舞台的背景墙&#xff0c;它们用绚丽多彩的画面吸引着我们的眼球。但你是否好奇&#xff0c;这些神奇的屏幕背后&#xff0c;是如何处理和显示信息的呢&#xff1f;今天&#xff0c;就让我们一起揭开…

计算机毕业设计hadoop+hive+spark医院数据分析大屏 医疗数据分析 医疗可视化 医院大数据 医院爬虫 医疗爬虫 数据仓库 大数据毕业设计

绪论 研究背景和意义 近年来&#xff0c;随着第五次科技革命的到来&#xff0c;科学、信息技术等迅猛发展&#xff0c;医疗信息方面的数据激增&#xff0c;全国各大医院每日也产生大量的数据&#xff0c;包括门诊每日接诊数据、患者信息数据、医院资源消耗数据等。数据的高速产…

Radamsa:一款高性能通用模糊测试工具

关于Radamsa Radamsa是一款高性能的通用模糊测试工具&#xff0c;广大研究人员可以将其当作一个应用程序稳定性测试的测试用例生成工具。 工具运行机制 该工具使用简单&#xff0c;支持自定义脚本开发&#xff0c;可以用于测试程序对格式错误和潜在恶意输入的承受能力。它的工…

MapCrafter - 定制精美的地图海报! | 限时免费

MapCrafter: 打造个性化城市地图海报的终极工具&#xff01; 在您的 iPhone、iPad、Mac 或 VisionPro 上轻松制作美丽的城市地图海报&#xff0c;展示您的城市情感与创意。 https://apps.apple.com/cn/app/mapcrafter/id6557037905 为什么选择 MapCrafter&#xff1f; • 城市…

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.7 项目管理原则

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

CTF-web基础 TCP/UDP协议

传输层协议由TCP/UDP协议组成&#xff0c;来控制信息的传输&#xff0c;二者有什么区别呢&#xff0c;TCP比较靠谱&#xff0c;但是UDP速度比较快一点。 TCP协议 Transmission Control protocol&#xff0c; 三次握手&#xff1a;先给服务器传输询问要发消息&#xff0c;然后…

Python语言编制批处理文件管理器

在软件开发和系统管理中&#xff0c;批处理文件&#xff08;.bat&#xff09;是一种常见且有用的工具。它们可以自动化重复性任务&#xff0c;简化复杂的操作流程。然而&#xff0c;随着批处理文件数量的增加&#xff0c;管理和执行这些文件可能变得麻烦。今天&#xff0c;我们…

uniapp HarmonyOS项目实战

1. uniapp HarmonyOS项目实战 Dcloud发布了uniapp兼容鸿蒙的文档&#xff1a;Uniapp开发鸿蒙应用 1.1. 说明 &#xff08;1&#xff09;鸿蒙开发只支持Vue3&#xff0c;不支持Vue2、不支持plus、但支持nvue &#xff08;2&#xff09;nvue编译到鸿蒙后非原生渲染&#xff0c;…

AUTOSAR实战教程 - 模式管理BswM与其他各模块的交互

近日驻厂某OEM,幸得大块的个人时间, 把BswM这一块的内容从ETAS/ISOLAR工具配置到代码实现做了一个全方位的CT. 2024,希望孜孜内卷的汽车人升职加薪! 博主近期写的一首小诗,也一并送给大家,懂的都懂: 在看不到阳光的冬天/ 我染了风寒/ 白天点灯/ 晚上吃药/ 躺在被窝里才敢…

2024上海初中生古诗文大会暑假备考:单选题真题和独家解析

今天是2024年8月3日&#xff0c;现在距离2024年初中生古诗文大会初选还有3个月&#xff08;11月3日正式开赛&#xff09;&#xff0c;我们继续来看10道选择题真题和详细解析。为帮助孩子自测和练习&#xff0c;题目的答案和解析统一附后。 本专题持续分享&#xff0c;欢迎到我…

C 语言二分查找法

二分查找定义 二分查找法用于查找一个有序数组中某个目标值是否存在&#xff0c;或者接近目标值的元素;相比把 整个数组遍历一次的0(n)复杂度&#xff0c;二分查找可以把复杂度降低到0(logzn): 原理讲解 原来中间的值mid &#xff08;left right&#xff09;/ 2&#xff0c;但…

用NSAT-1000实现S参数的自动化测试

在射频技术领域&#xff0c;S参数的准确测量对于保证产品质量至关重要。本文将带您了解NSAT-1000测试系统实现S参数自动化测试的流程。 S参数的测试原理 S参数测试原理是基于网络分析仪&#xff0c;网络分析仪发出一个已知频率和幅度的射频信号&#xff0c;通过网分测量信号得到…

eclipse Web Browser Setting

eclipse Web Browser Setting 默认程序打开浏览器的设置 Windows - Preference - General - Web Browser 没有设置的时候&#xff0c;就是你自己要手动打开浏览器&#xff0c;地址栏敲进去&#xff0c;例如&#xff1a; http://127.0.0.1:7070/FRTIMP_YTFRB_WEB/bin/MainApp.…

PHP高校迎新系统-计算机毕业设计源码08468

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套高校迎新系统。系统通过信息技术的应用&#xff0c;集成了首页、交流论坛、通知公…

万顺汽车租赁推荐系统

1 项目介绍 1.1 摘要 随着汽车租赁市场的不断发展&#xff0c;为了提升用户体验和管理效率&#xff0c;开发了一套集管理员和用户功能于一体的汽车租赁平台系统。该系统旨在提供便捷的用户信息管理、车辆信息管理、租赁订单管理等功能&#xff0c;以满足管理员和用户的不同需…