【C++】类和对象的引入
文章目录
- 前言
- 一、类的定义
- 二、类的访问控制与封装
- 三、类的作用域
- 四、类的实例化
- 五、类的存储方式及大小计算
- 六、隐藏的this指针
前言
-
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
-
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
比如洗衣机洗衣服的过程:
总共四个对象:人、衣服、洗衣液、洗衣机。
面向过程:主要是人将衣服放进洗衣机,再倒入洗衣液,启动洗衣机,然后洗衣机完成洗衣功能这些过程。
面向对象:整个过程是人、衣服、洗衣液、洗衣机这四个对象之间交互完成的。主要关注对象和对象之间的关系和交互。
一、类的定义
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
class className
{//类体:由成员函数和成员变量组成
};
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
是不是有点像C语言的struct结构体?
C语言的结构体中只能定义变量,struct在C++中升级成了类,不仅可以定义变量,也可以定义函数。struct在C++中既可以当成结构体使用,也可以当做类。
注意事项:
1.声明和定义全部放在类体中。成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2.类声明放在类中,成员函数定义在类外。此时成员函数定义前要加类名::,类内定义则不用。
class Date
{
public:void Print();int _year = 1;int _month = 1;int _day = 1;
};void Date::Print()
{cout << _year << "-" << _month << "-" << _day;
}
成员变量命名规则的建议:加前缀或者后缀用于区分成员变量和函数参数,一般在变量前加下划线_
二、类的访问控制与封装
访问限定符:
public(公有):可以在类外直接被访问。
private(私有):只能在类的内部访问。
private(保护):只能在类的内部及派生类(子类)中访问。

访问限定符规则:
1.public修饰的成员在类外可以直接被访问;private和protect修饰的不能在类外直接被访问。
2.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到类结束为止。
3.struct的类默认访问权限是public(struct要兼容C),class的类默认访问权限是private(私有)。
封装
面向对象的三大特性:封装、继承、多态。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。C++通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。
封装的好处:
1.隐藏事物的实现细节
2.提高了代码的复用性
3.提高了安全性
三、类的作用域
C++有四个作用域:局部域,全局域,命名空间域,类域。
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用域作用限定符 :: 指明成员属于哪个类域。
class Date
{
public:void Print();
private:int _year;int _month;int _day;
};//函数名前面加类域:: 说明该函数是属于这个类域的
void Date::Print()
{cout << _year << "-" << _month << "-" << _day;
}
四、类的实例化
用类类型创建对象的过程,称为类的实例化。
类只是说明了类有哪些成员,只是描述了对象,类的定义并没有分配实际的内存空间来存储它。 比如定义一个日期类。编译器并没有为此开辟新的空间。
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
一个类可以实例化多个对象,实例化出的对象占用实际的物理空间,存储类成员变量 。以上述日期类为例实例化对象。
int main()
{Date d1;//创建一个类对象d1.Init(2024, 6, 10);Date d2;Date d3;//实例化多个对象return 0;
}
五、类的存储方式及大小计算
类对象中只存储成员变量,没有存储成员函数,类的成员函数存放在公共代码区,所有类对象共用。 因为每个对象中成员变量是不同的,但是调用同一份函数。所以为了避免相同代码保存多次浪费空间,把类的成员函数放在公共代码区。
类的大小计算是不包括成员函数的,计算规则与C语言结构体大小计算规则一样,遵循结构体内存对齐规则。但是,空类的大小不是0,而是占用1个字节。(这与下面的this指针有关)
六、隐藏的this指针
定义一个日期类。
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1, d2;d1.Init(2024, 6, 10);d1.Print();d2.Init(2024, 9, 1);d2.Print();return 0;
}
对于上面这个日期类,实例化出两个对象d1和d2,d1和d2调用Init()和Print()函数时,都是去公共代码区调用的,并且Init()和Print()函数都是访问的_year,_month,_day,编译器是如何确定d1和d2的成员变量呢?
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
每个非静态成员函数都有个隐藏的this指针,但我们不能显示的写出来,因为他是隐含的,我们不能抢了编译器的活。但是我们可以直接在类里面使用。

this指针的特性
1.this指针的类型:类类型* const,即成员函数中,this指针不能被修改,但指向的内容可以修改。
2.只能在成员函数的内部使用。
3.this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针。因为是形参,所以this指针跟普通参数一样存在函数调用的栈帧里面。
下面两段代码练习一下
下面的程序的运行结果是? A.编译报错 B.运行崩溃 C.正常运行
class A { public:void Print(){cout << "Print()" << endl;} private:int _a; }; int main() {A* p = nullptr;p->Print();return 0; }答案:C
这段程序可以正常编译运行,因为ths指针接收到p传过来的空指针nullptr,但是没有解引用。
下面的程序的运行结果是? A.编译报错 B.运行崩溃 C.正常运行
class A { public:void Print(){cout << _a << endl;} private:int _a = 0; }; int main() {A* p = nullptr;p->Print();return 0; }答案:B
通过隐藏的this指针去访问成员变量,实际上执行的是this->_a,对空指针进行了解引用,所以程序会崩溃。
相关文章:
【C++】类和对象的引入
文章目录 前言一、类的定义二、类的访问控制与封装三、类的作用域四、类的实例化五、类的存储方式及大小计算六、隐藏的this指针 前言 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的&…...
11.5.k8s中pod的调度-cordon,drain,delete
目录 一、概念 二、使用 1.cordon 停止调度 1.1.停止调度 1.2.解除恢复 2.drain 驱逐节点 2.1.驱逐节点 2.2.参数介绍 2.3.解除恢复 3.delete 删除节点 一、概念 cordon节点,drain驱逐节点,delete 节点,在对k8s集群节点执行维护&am…...
Java中线程的创建方式
一、继承Thread类,重写run方法 public class MyThread{public static void main(String[] args) {Thread threadDome new ThreadDome();threadDome.start();} }class ThreadDome extends Thread{Overridepublic void run() {for (int i 0; i < 5; i) {try {Th…...
猫头虎推荐20个值得体验的通用大模型
猫头虎推荐20个值得体验的通用大模型 🚀 大家好,我是猫头虎,一名专注于科技领域的自媒体博主。今天是周一,新的开始,我们来深入探讨一下当前最值得体验的通用大模型。这些AI模型不仅功能强大,而且在各自领…...
Novartis诺华制药社招综合能力性格动机问卷入职测评笔试题库答案及包过助攻
【华东同舟求职】由资深各行业从业者建立的一站式人才服务网络平台,现阶段目标是“提升全市场各行业岗位信息的流动性和透明度”。我们接受众多行业机构的直接委托发布,并尽力通过各种方法搜寻高价值岗位信息。事实上,我们以发现不为人知的优…...
Adam优化算法
Adam优化算法 Adam(Adaptive Moment Estimation)是一种用于训练深度学习模型的优化算法,由Diederik P. Kingma和Jimmy Ba在2014年提出。Adam结合了动量和自适应学习率的方法,具有高效、稳定和适应性强的特点,被广泛应…...
MYSQL 三、mysql基础知识 7(MySQL8其它新特性)
一、mysql8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上 做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度…...
git error: does not have a commit checked out fatal: adding files failed
git add net error: net/ does not have a commit checked out fatal: adding files failed这个错误是因为尝试将一个尚未被提交的文件夹添加到Git中。解决这个问题的方法是先将文件夹中的文件提交到Git仓库中,然后再将文件夹添加到Git中。 首先,需要进…...
Java Websocket分片发送
一、分片发送和接收(复杂) 如果数据量太大,需要分多次发送, 需要考虑数据划分和重组的问题。 二、具体思路 每次发送和接收用一个布尔值变量指定是否为最后一个分片。 三、具体使用 (一)字符串分片发送: sendText(文本, 布尔值)…...
vivado NODE、PACKAGE_PIN
节点是Xilinx部件上用于路由连接或网络的设备对象。它是一个 WIRE集合,跨越多个瓦片,物理和电气 连接在一起。节点可以连接到单个SITE_, 而是简单地将NETs携带进、携带出或携带穿过站点。节点可以连接到 任何数量的PIP,并且也可以…...
JavaEE、SSM基础框架、JavaWeb、MVC(认识)
目录 一、引言 (0)简要介绍 (1)主要涉及的学习内容 (2)学习的必要性 (3)适用学习的人群(最好有这个部分的知识基础) (4)这个基础…...
【漏洞复现】飞企互联-FE企业运营管理平台 treeXml.jsp SQL注入漏洞
0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外,支持企业B2B、C2B与020等核心需求,为不同行业客户的互联网转型提供支持。其特色在于提供…...
Android基础-运行时权限
一、引言 随着智能手机和移动互联网的普及,Android操作系统作为其中的佼佼者,其安全性问题日益受到关注。为了保障用户数据的安全和隐私,Android系统引入了权限机制来管理和控制应用程序对系统资源和用户数据的访问。特别是在Android 6.0&am…...
postman断言及变量及参数化
1:postman断言 断言:判断接口是否执行成功的过程 针对接口请求完成之后,针对他的响应状态码及响应信息进行判断,代码如下: //判断响应信息状态码是否正确 pm.test("Status code is 200", function () { pm.response.…...
安装和使用TrinityCore NPCBot
安装TrinityCore NPCBot 官网:GitHub - trickerer/Trinity-Bots: NPCBots for TrinityCore and AzerothCore 3.3.5 基本安装方法 Follow TrinityCore Installation Guide (https://TrinityCore.info/) to install the server firstDownload NPCBots.patch and put …...
Hvv--知攻善防应急响应靶机--Linux2
HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理: 夸克网盘:https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘:https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP:https://mp.weixin.…...
replaceAll is not a function 详解
先说说原因: 在chrome 浏览器中使用 replaceAll 报这个错误,是因为chrome 版本过低, 在chrome 85 以上版本才支持 用法 replaceAll(pattern, replacement)const paragraph "I think Ruths dog is cuter than your dog!"; console…...
如何设置天锐绿盾的数据防泄密系统
设置天锐绿盾的数据防泄密系统,可以按照以下步骤进行: 一、系统安装与初始化 在线或离线安装天锐绿盾数据防泄密系统,确保以管理员身份运行安装包,并按照安装向导的提示完成安装。输入序列号进行注册,激活系统。 二…...
003 gitee怎样将默认的私有仓库变成公开仓库
先点击“管理”, 再点击“基本信息” 在“是否开源”里, 选择:开源...
Spring框架中的IOC(控制反转)详解
Spring框架中的IOC(控制反转)详解 一、引言 在软件开发中,设计模式与框架的应用极大地提高了开发效率和软件质量。其中,Spring框架因其强大的功能和灵活的扩展性,成为了Java企业级应用开发的首选。而Spring框架中的核…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
