C++八股学习心得.4

news2025/5/24 18:59:59

1.C++ 类 & 对象

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。是 C++ 的核心特性,通常被称为用户定义的类型

用于指定对象的形式,它包含了数据表示法和用于处理数据的方法类中的数据和方法称为类的成员函数在一个类被称为类的成员函数

C++ 类定义

定义一个类,本质上是定义一个数据类型的蓝图类定义是以关键字 class 开头,后跟类的名称类的主体是包含在一对花括号中类定义后必须跟着一个分号或一个声明列表关键字 public 确定了类成员的访问属性在类对象作用域内,公共成员在类的外部是可访问的类外依然可以访问。您也可以指定类的成员为 private 或 protected

定义 C++ 对象

类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样类的对象的公共数据成员可以使用直接成员访问运算符 (.) 来访问。私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问

2.C++ 类成员函数 

类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义。在类定义中定义的成员函数把函数声明为内联,即便没有使用 inline 标识符。也可以在类的外部使用范围解析运算符 :: 定义该函数在 :: 运算符之前必须使用类名。调用成员函数是在对象上使用点运算符(.),这样它就能操作与该对象相关的数据

3.C++ 类访问修饰符 

数据隐藏是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。成员和类的默认访问修饰符是 private

公有(public)成员

公有成员在程序中类的外部是可访问的您可以不使用任何成员函数来设置和获取公有变量的值

私有(private)成员

私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员默认情况下,类的所有成员都是私有的。没有使用任何访问修饰符,类的成员将被假定为私有成员实际操作中,我们一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数

保护(protected)成员

保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的

4.C++ 类构造函数 & 析构函数 

类的构造函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。

构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值

带参数的构造函数

默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值,有参构造

类的析构函数

类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。

析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

C++ 拷贝构造函数

系统为对象 B 分配了内存并完成了与对象 A 的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。

拷贝构造函数通常用于:

通过使用另一个同类型的对象来初始化新创建的对象。

复制对象把它作为参数传递给函数。

复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。

5.C++ 友元函数 

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend

6.C++ 内联函数

如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。

类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。有了内联函数,就能像调用一个函数那样方便地重复使用一段代码,而不需要付出执行函数调用的额外开销。很显然,使用内联函数会是最终可执行程序的体积增加。以空间换取时间,或消耗时间来增加空间,

7.C++ this 指针

在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象

友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针

8.C++ 指向类的指针

一个指向 C++ 类的指针与指向结构的指针类似访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样与所有的指针一样,您必须在使用指针之前,对指针进行初始化

9.C++ 类的静态成员

我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本

静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,

如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来静态成员函数即使在类对象不存在的情况下也能被调用静态函数只要使用类名加范围解析运算符 :: 就可以访问。

静态成员函数只能访问静态数据成员不能访问其他静态成员函数和类外部的其他函数。

静态成员函数有一个类范围他们不能访问类的 this 指针您可以使用静态成员函数来判断类的某些对象是否已被创建

10.C++ 继承

面向对象程序设计中最重要的一个概念是继承继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。

创建一个类时,您不需要重新编写新的数据成员和成员函数只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类

继承代表了 is a 关系

总结:

面向对象编程,类用户可以自定义数据类型,类指定了对象形式,数据和数据处理方法都是类的成员,函数就是成员函数,类关键字class+名称+花括号,public共有属性类内类外都可以访问,private和protected私有属性和保护属性,对象根据类创建,共有属性数据可以直接使用.来进行访问

类成员函数是对成员数据进行操作,可以在类内定义,也可以使用::在类外定义,使用.来访问成员数据

访问修饰符:public,private,protected,如果没有指定那么默认则是private,public类内类外都可以访问,私有属性只有类和友元函数可以访问,类外不可访问,默认私有属性,一般情况私有属性定义数据,共有属性定义函数,保护属性与私有属性类似,只是派生类可以访问(继承)

构造函数成员函数,创建对象时候调用,构造函数名与类名完全相同,不会返回任何类型,默认是无参构造函数,有参构造就是在创建对象就给对象赋值,析构函数删除对象执行,函数名称与类名相同在前面加~,也不返回任何类型数据,拷贝构造函数使用创建过对象来创建新的对象,如果类内有指针,且有动态内存,需要定义拷贝构造

友元函数 是类外函数有权访问私有和保护成员,不是成员函数,函数是类的友元需要加friend关键字

内联函数需要关键字inline

c++this指针对象用来访问自己的地址,成员函数内部用来调用对象,成员函数有this指针

访问类的指针需要使用->来访问,指针使用的时候需要初始化

static可以使类的成员变为静态变量或者函数,只有一个副本,可以在类外利用::来重新声明静态变量对其进行初始化,静态成员函数::也可以访问,静态成员函数只能访问静态数据成员,不能访问其他静态成员函数和类外其他成员函数,不能使用this指针,

继承,依据一个类来定义一个类,不需重新创建成员函数和数据成员,指定新的类(派生类)来继承已有的类(基类)即可

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

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

相关文章

图像融合论文阅读:MURF: Mutually Reinforcing Multi-Modal Image Registration and Fusion

article{xu2023murf, title{MURF: Mutually Reinforcing Multi-modal Image Registration and Fusion}, author{Xu, Han and Yuan, Jiteng and Ma, Jiayi}, journal{IEEE Transactions on Pattern Analysis and Machine Intelligence}, year{2023}, publisher{IEEE} } 论文级别…

Java进阶 1-2 枚举

目录 常量特定方法 职责链模式的枚举实现 状态机模式的枚举实现 多路分发 1、使用枚举类型实现分发 2、使用常量特定方法实现分发 3、使用EnumMap实现分发 4、使用二维数组实现分发 本笔记参考自: 《On Java 中文版》 常量特定方法 在Java中,我们…

数字孪生技术详解

在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 数字孪生技术正在迅速彻底改变企业的运营方式。借助数字孪生技术&#xff0c…

洗地机什么牌子最好?家用洗地机推荐指南

随着人们对健康和卫生的关注日益增长,洗地机成为了现代家庭清洁的必备工具。然而,在市场上琳琅满目的洗地机品牌中,洗地机哪个品牌最好最实用呢?这是消费者最为关心的问题。现本文将为您介绍几个备受推崇的洗地机品牌,帮助您在众…

拖拽式工作流好用吗?有何特点?

大家都知道,随着行业的进步和发展,低代码技术平台也迎来了蓬勃发展期。很多企业喜欢使用低代码实现提质增效的办公效果,拖拽式工作流是其中一个功能,是助力企业实现流程化办公的得力助手。那么,拖拽式工作流好用吗&…

数字信号处理期末复习——计算大题(一)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

【RocketMQ每日一问】RocketMQ中raft的应用?

1.rocketmq中raft算法实现方式 RocketMQ 中实现 Raft 算法的模块是 DLedger,它是一种基于 Raft 协议的分布式日志存储模式,用于提供高可用性和数据一致性的保证,保证消息的可靠性和持久化存储。 在 DLedger 中,每个节点都维护着…

vue3顶部内容固定定位,下面内容可以向上滚动

功能要求:一个div里有两个模块儿,顶部按钮模块儿和下面的内容区域模块儿,顶部按钮模块儿固定在顶部不随滚动条滚动,下面内容区域可以滚动 如图: 思路是: 1、顶部按钮固定定位,会脱离文档流&…

【无标题】一本好书

(https://img-blog.csdnimg.cn/9e3c2302242149e4ac7dbc834bd5e027.jpg)(https://img-blog.csdnimg.cn/3427ed8648ff46bbb496ed512e0aa9cd.jpg1

109-Gradle构建工具的学习

Gradle构建工具的学习 Gradle 简介: Gradle 是一款Google 推出的基于 JVM、通用灵活的项目构建工具,支持 Maven,JCenter 多种第三方仓库,支持传递性依赖管理、废弃了繁杂的xml 文件,转而使用简洁的、支持多种语言&am…

懒加载的el-tree中没有了子节点之后还是有前面icon箭头的展示,如何取消没有子节点之后的箭头显示

没有特别多的数据 <template><el-tree:props"props":load"loadNode"lazyshow-checkbox></el-tree></template><script>export default {data() {return {props: {label: name,children: zones,isLeaf:"leaf",//关…

nginx下upstream模块详解

目录 一&#xff1a;介绍 二&#xff1a;特性介绍 一&#xff1a;介绍 Nginx的upstream模块用于定义后端服务器组&#xff0c;以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分&#xff0c;允许将请求转发到多个后端服务器&#xff0c;并平衡负载。 在upst…

如潮好评!优秀选手视角下的第二届粤港澳大湾区(黄埔)国际算法算例大赛

为发挥国家实验室作用、推动地区大数据与人工智能算法的生态体系建设&#xff0c;琶洲实验室&#xff08;黄埔&#xff09;受广州市黄埔区政府委托&#xff0c;于 2022 年创办粤港澳大湾区&#xff08;黄埔&#xff09;国际算法算例大赛&#xff0c;推动原始创新、赋能社会经济…

以 Serverfull 方式运行无服务器服务

当前 IT 架构中最流行的用例是从 Serverfull 转向 Serverless 设计。在某些情况下&#xff0c;我们可能需要以 Serverfull 方式设计服务或迁移到 Serverfull 作为运营成本的一部分。 在本文中&#xff0c;我们将展示如何将 Kumologica flow 作为 Docker 容器运行。通常&#x…

力扣322. 零钱兑换(java语言实现 完全背包问题)

Problem: 322. 零钱兑换 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该题目可以归纳为完全背包问题&#xff0c;最少需要多少物品能填满背包。该类问题大体思路如下 状态&#xff1a; int dp[ n n n][ w 1 w 1 w1] (其中 n n n表示有 n n n个物品&#xff0c; …

Python常用模块之hashlib

常用模块 - hashlib模块 一、简介 Python的hashlib提供了常见的摘要算法&#xff0c;如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。 什么是摘要算法呢&#xff1f;摘要算法又称哈希算法、散列算法。它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的…

14.用户管理

目录 1、权限表 1、user表 1.用户列 2.权限列 3.安全列 4.资源控制列 2、db表和host 表 1.用户列 2.权限列 3. tables_priv 表和 columns _priv 表 4.procs_priv 表 2、账户管理 1. 登录和退出MySQL服务器 2、创建普通用户&#xff1a; 1.使用CREATE USER语创建…

URLDecoder: Illegal hex characters in escape (%) pattern - negative value

1、前提&#xff1a; 使用URLDecoder.decode(“字符串”“utf-8”)&#xff1b;进行解码出现上述问题 2、原因&#xff1a; 字符串的内容出现%后不是一个16进制的数&#xff08;即从0——FF&#xff09; 3、解决方法&#xff1a; 检查传入的字符看是否%后有不是16进制的数…

【python测验】数字游戏 取模数 数位dp

这题目看得人感觉要失去梦想…… 题目&#xff1a; 看不懂也做不出来&#xff0c;python方法未知&#xff0c;记录几个可供参考的帖子。 LightOJ 1068 Investigation 算法提高篇–动态规划&#xff08;八&#xff09;&#xff1a;数位DP&#xff08;3&#xff09;