【C++】类和对象1
类和对象11、类的定义C中可以用struct定义一个类但更多的是使用class定义类举例C语言中的结构体// C 语言仅能定义变量不能定义函数structStudent{charname[20];intage;// 错误C 不允许结构体里写函数// void show() { ... }};C中的类// C 类变量 函数 访问控制class Student{private:// 成员变量属性std::string name;intage;public:// 成员函数方法voidsetInfo(std::string n,inta){namen;agea;}voidshowInfo(){std::coutname agestd::endl;}};C中struct也可以定义类C兼容C中struct的用法同时struct升级成了类明显的变化是struct中可以定义函数一般情况下我们还是推荐用class定义类。类的两种定义方法声明和定义全部放在类体中//定义一个栈的结构体class Stack{public://初始化栈voidInit(intn4){array(int*)malloc(sizeof(int)*n);if(nullptrarray){perror(malloc申请空间失败);return;}capacityn;top0;}int*array;size_tcapacity;size_ttop;};注意成员函数如果在类中定义编译器可能会将其当成内联函数处理最终是否内联由编译器决定类的声明放在.h文件中成员函数的定义放在.cpp文件中Stack.h文件 class Stack{public://成员函数//定义在类⾯的成员函数默认为inlinevoidInit(intn4);//成员变量int*array;size_tcapacity;size_ttop;};Stack.cpp文件#includeF.hvoidStack::Init(intn)//这里不能写int n4;因为默认参数只能写在函数声明中{array(int*)malloc(sizeof(int)*n);if(nullptrarray){perror(malloc申请空间失败);return;}capacityn;top0;}注意成员函数名前要加类名::告诉编译器这个函数属于哪个类域2、类的访问限定符public公有private私有protected私有 说明public修饰的成员在类外面可以直接被访问protect和private修饰的成员在类外不能直接被访问protected和private是一样的class定义成员没有被访问限定符修饰时默认为privatestruct默认为public一般成员变量都会被限制为private/protected需要给别人使用的成员函数会放为public3、类域类定义了一个新的作用域类的所有成员都在类的作用域中#includeiostreamusing namespace std;class Stack{public:// 成员函数voidInit(intn4);private:// 成员变量int*array;size_tcapacity;size_ttop;};// 声明和定义分离需要指定类域voidStack::Init(intn){array(int*)malloc(sizeof(int)*n);if(nullptrarray){perror(malloc申请空间失败);return;}capacityn;top0;}intmain(){Stack st;st.Init();return0;}如果Init不指定类域Stack那么编辑器就把Init当成全局函数那么编译时找不到array等成员的声明/定义在哪里就会报错。指定类域Stack就会去对应的类域里面搜索当类域里面也没有时最后回到全局搜索如果全局没有编译就会报错4、类的实例化实例化概念用类类型在物理内存中创建对象的过程称为类的实例化类是对象进行一种抽象描述是一个模型一样的东西限定了类有哪些成员只是声明没有分配空间。类和对象的关系可以看成使用建筑设计图造出房子类是设计图不能存数据实例化出的对象才能分配物理内存存储数据class Date{public:voidInit(intyear,intmonth,intday){_yearyear;_monthmonth;_dayday;}voidPrint(){cout_year-_month-_dayendl;}private:int_year;//声明 没有空间//只能由实例化的对象分配为例内存存储数据int_month;int_day;};intmain(){Date d1;Date d2;//实例化对象出d1和d2//Init函数指针是一样的 不需要独立空间d1.Init(2022,1,1);d2.Init(2022,1,2);d1.Print();d2.Print();return0;}错误示范Date._year2026;相当于在图纸里住人5、类的对象类对象的大小#includeiostreamusing namespace std;// 计算⼀下A/B/C实例化的对象是多⼤//类中既有成员变量又有成员函数class A{public:voidPrint(){cout_chendl;}private:char_ch;int_i;};//类中只有成员函数class B{public:voidPrint(){//...}};//类中什么也没有空类class C{};intmain(){A a;B b;C c;coutA的大小sizeof(a)endl;coutB的大小sizeof(b)endl;coutC的大小sizeof(c)endl;return0;}运行结果A的大小8B的大小1C的大小1类的大小实际就是该类中“成员变量”之和要遵守内存对齐规则没有成员变量的类编译器通常会给一个字节来占位标识对象的存在拿Date类举例Date实例化d1和d2两个对象d1和d2都有各自独立的成员变量_year/_month/_day存储各自的数据但是d1和d2的成员函数Init指针却是一样的如果存储在对象中每次实例化时成员函数就重复存储一次浪费空间所以成员函数要放在公共代码区以建房子为例类是图纸实例化的对象是按照图纸造出来的房子成员变量相当于房子中的房间而成员函数相当于公共场所不需要建在每一个房子里建在公共场所大家都可以使用注意sizeof(类)和sizeof(对象)计算出来的结果一样内存对齐规则第一个成员在与结构体偏移量为0的地址处。其他成员变量要对齐到某个数字对齐数的整数倍的地址处。注意对齐数 编译器默认的⼀个对齐数 与 该成员大小的较小值。结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。class A{public:voidPrint(){}private:char_ch;int_i;};编译器一次读取4个字节在内存没对齐的情况下读取时非常麻烦要把第一个读取的字节去掉再把第二次读取的和第一个字节拼接而在内存对齐的情况下只需读取2次即可6、this指针//定义一个日期类class Date{public:voidInit(intyear,intmonth,intday){_yearyear;this-_monthmonth;this-_dayday;}voidPrint(){cout_year/_month/_dayendl;}private:// 这⾥只是声明没有开空间int_year;int_month;int_day;};intmain(){// Date类实例化出对象d1和d2Date d1;Date d2;// d1.Init(d1, 2024, 3, 31);d1.Init(2024,3,31);//d1初始化d1.Print();//打印d2.Init(2024,7,5);//d2初始化d2.Print();//打印return0;}输出结果2024/3/312024/7/5那当d1调用Init和Print函数时该函数是如何知道应该访问的是d1对象还是d2对象呢这里C给了一个隐含的this指针解决这里的问题编译器编译后类的成员函数会在形参的第一个位置增加一个当前类类型的指针叫做this函数题中的有关成员变量的操作都需要this指针访问比如Print函数voidPrint(){cout_year/_month/_dayendl;}真实原型为voidPrint(Date*constthis){coutthis-_year/this-_month/this-_dayendl;}d1和d2是同一个函数调用时传递的参数不同所以调用谁打印的就是谁的结果。C规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理)但是可以在函数体内显示使用this指针。注意this存储在栈中this指针和普通的函数形参一样在函数调用的时候入栈存储在函数的调用栈帧里在成员函数中不能修改this指针的指向this指针是成员函数隐藏的指针形参不需要写this1.下面程序编译运行结果是A、编译报错 B、运行崩溃 C、正常运行#includeiostreamusing namespace std;class A{public:voidPrint(){coutA::Print()endl;}private:int_a;};intmain(){A*pnullptr;p-Print();return0;}定义一个A类型的指针p并置为空调用p的成员函数Print不发生解引用Print函数的地址不在对象中所以不会报错正确答案为C正常运行因为没有访问任何类中的其他成员根本没有使用this指针2.下面程序编译运行结果是A、编译报错 B、运行崩溃 C、正常运行#includeiostreamusing namespace std;class A{public:voidPrint(){coutA::Print()endl;cout_aendl;}private:int_a;};intmain(){A*pnullptr;p-Print();return0;}定义一个A类型的指针p并置为空调用p的成员函数Print在Print函数中使用了其他成员_a相当于this→_athis是空指针所以这就成为了解引用空指针运行崩溃如果文章中有错误或不足欢迎大家指正交流。

相关新闻

基于TPAFE0808和STM32的多通道信号采集系统设计

基于TPAFE0808和STM32的多通道信号采集系统设计

1. 项目概述:多通道信号控制与监测系统设计在工业自动化、医疗设备和科研仪器等领域,多通道信号的高精度控制和实时监测是核心需求。本项目基于TPAFE0808模拟前端芯片和STM32F401RB微控制器构建了一个8通道信号采集与控制系统,实现了对模拟信…

2026/7/5 15:32:45阅读更多 →
ICM-42688-P与STM32L011K4在工业运动检测中的应用

ICM-42688-P与STM32L011K4在工业运动检测中的应用

1. ICM-42688-P与STM32L011K4的黄金组合解析在工业自动化和机器人控制领域,精确的运动感知是系统稳定运行的基础。ICM-42688-P作为TDK InvenSense推出的6轴MEMS运动跟踪传感器,与STMicroelectronics的STM32L011K4超低功耗微控制器形成的解决方案&#xf…

2026/7/5 15:32:45阅读更多 →
Nintendo Switch游戏文件终极管理指南:NSC_BUILDER完全解析

Nintendo Switch游戏文件终极管理指南:NSC_BUILDER完全解析

Nintendo Switch游戏文件终极管理指南:NSC_BUILDER完全解析 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights enc…

2026/7/5 15:32:45阅读更多 →
sw-test核心代码解密:cacheFirst策略如何提升Web应用性能

sw-test核心代码解密:cacheFirst策略如何提升Web应用性能

sw-test核心代码解密:cacheFirst策略如何提升Web应用性能 【免费下载链接】sw-test Service Worker test repository. This is a very simple demo to show basic service worker features in action. 项目地址: https://gitcode.com/gh_mirrors/sw/sw-test …

2026/7/5 16:37:48阅读更多 →
OneNote到Markdown终极迁移指南:如何无损转换你的知识库

OneNote到Markdown终极迁移指南:如何无损转换你的知识库

OneNote到Markdown终极迁移指南:如何无损转换你的知识库 【免费下载链接】onenote-md-exporter ConsoleApp to export OneNote notebooks to Markdown formats 项目地址: https://gitcode.com/gh_mirrors/on/onenote-md-exporter 你是否在使用OneNote多年后&…

2026/7/5 16:37:48阅读更多 →
cog-comfyui成本控制策略:云原生AI服务的经济优化

cog-comfyui成本控制策略:云原生AI服务的经济优化

cog-comfyui成本控制策略:云原生AI服务的经济优化 【免费下载链接】cog-comfyui Run ComfyUI with an API 项目地址: https://gitcode.com/gh_mirrors/co/cog-comfyui 在云原生环境中部署AI服务时,成本控制是每个开发者和企业必须面对的关键挑战。…

2026/7/5 16:37:48阅读更多 →
Sun-Direction-Lora-Flux2Klein9B v2版本前瞻:未来将支持哪些令人期待的光影控制新特性?

Sun-Direction-Lora-Flux2Klein9B v2版本前瞻:未来将支持哪些令人期待的光影控制新特性?

Sun-Direction-Lora-Flux2Klein9B v2版本前瞻:未来将支持哪些令人期待的光影控制新特性? 【免费下载链接】Sun-Direction-Lora-Flux2Klein9B 项目地址: https://ai.gitcode.com/hf_mirrors/eric-venti-seeds/Sun-Direction-Lora-Flux2Klein9B Su…

2026/7/5 16:37:48阅读更多 →
GDash企业级监控方案:多团队协作、权限管理与告警集成完整指南

GDash企业级监控方案:多团队协作、权限管理与告警集成完整指南

GDash企业级监控方案:多团队协作、权限管理与告警集成完整指南 【免费下载链接】gdash A dashboard for Graphite 项目地址: https://gitcode.com/gh_mirrors/gd/gdash 在当今复杂的IT环境中,企业需要一个功能强大且易于使用的监控解决方案来确保…

2026/7/5 16:37:48阅读更多 →
CVE-bin-tool漏洞扫描中CPE与PURL优先级解析与实战

CVE-bin-tool漏洞扫描中CPE与PURL优先级解析与实战

1. 项目概述:当SBOM遇上漏洞扫描,CPE与PURL的“优先级之争”最近在搞一个安全自动化项目,需要把漏洞扫描工具集成到CI/CD流水线里。选型时,CVE-bin-tool这个开源工具进入了我的视野,它主打轻量、快速,能直接…

2026/7/5 16:32:48阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →