【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框架中的核…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
