C++笔记-类和对象-1

发布时间:2026/11/1 1:31:36

C++笔记-类和对象-1 以下是个人的学习笔记,如果有有些许出错的地方欢迎在评论区指出,如果有什么疑问,也可以在评论区问,我会尽力解答.1.类的引入C兼容C语言,struct以前的用法都可以继续用,同时struct升级成了类以一个Stack结构体为例:#includeiostream using namespace std; struct Stack { int* a; int top; int capacity; }; int main() { //C语言的结构体定义 struct Stack st1; //C的类定义 Stack st2; return 0; }类当中,不仅可以有成员变量,还能有成员函数,这个成员函数的好处是可以与其他类的成员函数重名,比如你要同时写栈,队列,链表...你就可以在类内直接写Init()初始化函数,而不是为了避免重名而写StackInit(),QueueInit(),ListInit()....因为:类定义的也是一个域,所以函数可以同名(在不同的域中)PS:C中每个{}都是一个域.实例代码如下:#includeiostream using namespace std; struct Stack { //成员函数 void Init() {//初始化,可以区别于队列,链表...的初始化 //... } void push(int x) { //... } //成员变量(与成员函数的位置没有要求, // 把整个类看成了一个整体,不用担心找不到) int* a; int top; int capacity; }; int main() { struct Stack st1; //成员函数调用 st1.Init(); st1.push(10); Stack st2; st2.Init(); st2.push(20); return 0; }2.类的定义都说结构体变成类了嘛,那类的定义就跟结构体一样了//类的定义 class className { //类体:由成员函数和成员变量组成 };//一定要注意后面的分号3.访问限定符既然说,结构体变成了类,那我直接用类的方式声明结构体好不好?#includeiostream using namespace std; class Stack1 { void Init(){} void push(int x) {} int* a; int top; int capacity; }; int main() { class Stack1 st1; st1.Init(); st1.push(10); Stack1 st2; st2.Init(); st2.push(20); return 0; }看起来没毛病,但是你运行一下呢?你会发现编译通过不了,如下图这是因为:C新增了三种访问限定符1.public(公有)-------可以在类外面直接访问2.protect(保护)------在类外面不能直接访问3.private(私有)------在类外面不能直接访问(在C学习前期(继承之前)可以把2,3看成一种因为类内的成员变量和成员函数,默认是private,不能在类外使用,所以才访问受限,不能编译为什么结构体struct就可以呢?因为struct默认是public,(跟class还是有点区别的哈)那怎么才能在类外使用class内的函数呢?只要加上访问限定符就可以了,像这样:#includeiostream using namespace std; class Stack1 { public: void Init(){} void push(int x) {} private: int* a; int top; int capacity; }; int main() { class Stack1 st1; st1.Init(); st1.push(10); Stack1 st2; st2.Init(); st2.push(20); return 0; }访问限定符的使用方法显而易见,就是直接加冒号:使用,而他的范围呢?范围:一直作用到下一个访问限定符或类结束(没有下一个访问限定符了)那为什么会存在这些访问限定符呢?这就涉及到了面向对象语言的三大特性:封装,继承,多态,---其中的封装封装,简而言之就是,把数据和方法放在一起,想给你看的就变成公有,不想给你看的就变成私有.封装的本质是一种管理,方便用户使用.他只把想要给你使用的权限给你,让你能够直接使用权限达到某种目的,但是不告诉你达到目的的过程,也不给你权限修改这个过程,比如让你使用某个函数,但是这个函数需要很多复杂的中间变量,一旦给你这些中间变量的访问权限,你在使用的过程中万一不小心修改,那这个函数的效果就可能跟预期不同了,所以他就会把这些变量保护起来.----通过使用访问限定符.4.成员函数的定义和声明既然是函数,就有定义和声明,类的函数在类内,(定义和声明都在类域内),方法跟普通函数在全局域内的定义和声明是一样的,如果类的函数的定义和声明不都在类域内呢?(声明肯定一定是要在类域内的嘛,不然你凭啥说他是类的成员函数.)类的成员函数在类外的定义如下:class Stack1 { public: void Init();//声明 void push(int x) {} private: int* a; int top; int capacity; }; void Stack1::Init() {}//定义5.类的inline函数成员函数直接在类里面定义,默认就是inline函数,不管你加不加inline标识符所以,长的成员函数,我们就要在类内声明,类外定义,短的成员函数我们可以在类内声明定义这时候就有人问了:牛霸牛霸,我不小心把长的成员函数也写在了类里面咋办?没关系!你的成员函数能否成为真正的inline,又不是你来决定的,你只是提个建议,编译器会帮你否决的PS:补药搞事情,在类内加inline声明函数,却在类外定义,inline函数的声明和定义最好放在一个域内6.成员变量的命名我们平时可能会写出这样的代码class Date { public: void Init(int year) { year year; } private: int year; int month; int day; };看似没毛病,但是你初始化的时候,你的year到底是year呢,还是year呢?我也不知道啊,虽然这样可以过编译,但可能会出现问题啊,所以,你可以稍微修改一下成员变量的名字,比如这样:class Date { public: void Init(int year) { _year year; } private: int _year; int _month; int _day; };7.类实例化对象/对象定义声明和定义的区别:声明不开空间,定义开空间以下只是一个类的声明,而不是定义,没有开空间,里面的成员都不能使用class Stack { public: void Init(){} void push(int x) {} private: int* a;//声明 int top; int capacity; };类的定义,也叫实例化,方式如下:int main() { //类实例化对象/对象定义 Stack st; return 0; }创建了st的实例之后,就可以使用Stack的成员了,可以将类的声明看作一个图纸,类的定义看作根据图纸建造房子,只有建造了房子之后,才能住人,也就是使用成员8.对象的存储你猜猜以下代码的结果:coutsizeof(st)\n;结果:对象的大小只储存成员变量,没有储存成员函数PS:这里的16并不是单纯的8(地址)4(int)4(int)16;对于这种类的成员变量的存储,因为计算机要保证访问数据的效率,所以会涉及内存对齐的问题,(等我以后有时间写了相关的博客,会把链接放在这......)class Stack { public: void Init(){} void push(int x) {} int* a;//声明 int top; int capacity; }; int main() { Stack st1; Stack st2; st1.top 0; st2.top 1; st1.Init(); st2.Init(); return 0; }思考一下,以上代码,st1的top和st2的top是不是同一个top?st1的Init()和st2的Init()是不是同一个Init()?答案第一个是否定的,而第二个,是肯定的,第一个很好理解,第二个嘛,是因为,他们的函数是一样的,单独存储在对象内,可以,但是太占用空间,于是就存储在了公共的区域,以方便节省空间.就比如成员变量是家里的家具,而成员函数就是加油站,学校之类的,可以使用的公共区域,没必要在自己家里建一个加油站和学校,只需要在家外面建造一个一起使用就可以.
延伸阅读

更多相关文章

2026/11/1 1:31:36

内存对比工具V2.6版:功能解析与应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 1:31:36

loklak.net搜索API参考指南:快速让应用接入开源搜索引擎

【免费下载链接】loklak.net loklak.net 项目地址: https://gitcode.com/gh_mirrors/lo/loklak.net 点击查看 免费下载 Loklak Search(官方域名 loklak.net)是一个免费、开源的搜索引擎,本文是一份完整的搜索 API 参考指南&#…

2026/11/1 1:26:36

华芯为8通道温度/程控电阻箱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑