以下是个人的学习笔记,如果有有些许出错的地方欢迎在评论区指出,如果有什么疑问,也可以在评论区问,我会尽力解答.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()?答案第一个是否定的,而第二个,是肯定的,第一个很好理解,第二个嘛,是因为,他们的函数是一样的,单独存储在对象内,可以,但是太占用空间,于是就存储在了公共的区域,以方便节省空间.就比如成员变量是家里的家具,而成员函数就是加油站,学校之类的,可以使用的公共区域,没必要在自己家里建一个加油站和学校,只需要在家外面建造一个一起使用就可以.
企业数字化 ERP 产品动态
相关推荐
MapReduce - 分区排序:TotalOrderPartitioner 的使用详解 👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕MapReduce这个话题展开,希望能为你带来一些启… · 2026/11/3 16:29:41
001-ROS2和Ubuntu版本搭配 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 19:37:07
深入cnsplots内部:延迟导入API设计、统计管线与SVG导出机制源码解析 【免费下载链接】cnsplots 🎨 Toolkit for generating publication-quality plots for Cell, Nature and Science journals 项目地址: https://gitcode.com/gh_mirrors/cn/cnsplots 点击查看 免费下载 🔬 cnsplots 是一款专为 Cell、Nature、… · 2026/11/1 1:30:16
搜狗输入法精简优化指南:性能提升与隐私保护 1. 为什么需要精简优化版输入法在Windows平台上,搜狗拼音输入法长期占据着市场领先地位。但近年来,官方版本逐渐变得臃肿——安装包从早期的20MB膨胀到现在的80MB,后台常驻进程从2个增加到5个,内存占用从80MB飙升到300MB。这种&qu… · 2026/11/3 20:37:01
从蜂鸣器到嵌入式声音输出:驱动电路、PWM与实战调参全解析 1. 项目拆解:一个“buzz”到底能做出什么名堂如果你在嵌入式、单片机、物联网这几个圈子里混过一阵子,看到“buzz”这个词第一反应大概率不是“嗡嗡的噪音”,而是蜂鸣器的英文缩略——buzzer。GitHub、电子工程社区、各大创客比赛里ÿ… · 2026/11/3 20:37:01
本科论文写作AI工具评测与使用指南 1. 本科毕业论文写作的痛点与AI工具的价值作为一名经历过本科论文写作的过来人,我清楚地记得那段熬夜查文献、反复修改格式、与导师来回沟通的痛苦经历。2026届的毕业生们是幸运的——如今AI工具已经能够解决论文写作中80%的机械性工作。但面对市面上琳琅满目的AI工… · 2026/11/3 20:37:01
CSS特异性与!important的正确使用指南 1. 为什么我们总想用!important在CSS开发中,!important就像是一把双刃剑。新手开发者常常把它当作救命稻草,而资深开发者则视之为洪水猛兽。但为什么我们总是忍不住想用它呢?首先,CSS的层叠特性决定了样式的优先级规则。当多个样式… · 2026/11/3 20:37:01
MQTT协议详解:从原理到物联网实战应用 1. MQTT协议的前世今生MQTT(Message Queuing Telemetry Transport)最初由IBM的Andy Stanford-Clark和Arcom(现为Eurotech)的Arlen Nipper在1999年设计,最初是为了解决石油管道监控系统中的数据传输问题。这个设计背景决… · 2026/11/3 20:37:01
反向技能拆解法:从成品倒推技能树的高效学习策略 1. 一次让我对"学习"产生怀疑的真实经历大概一个多月前,我接到一个临时任务:给团队做一份能放在大屏上的数据看板。听起来不复杂,但我当时的真实水平是——Excel会用数据透视表,写过几条SQL,图表库只在入门教… · 2026/11/3 20:36:00
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的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/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46