类和对象【上】

news2024/11/29 0:30:32

目录

面向过程和面向对象

C语言

C++

类的定义

类的两种定义方式

成员变量命名规则

类的访问限定符和封装

面试题

封装

类的作用域

类的实例化

类对象模型

 内存分配

内存对齐

this指针

特性

面试题

this指针存储在哪里?

this指针可以为空么?

结论:


面向过程和面向对象

C语言

C语言是面向过程,关注的主要是过程,分析求解问题的步骤,通过函数调用逐步解决问题

C++

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

类的定义

在C语言中结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,在C++中,更喜欢用class来代替

类的两种定义方式

一种是是声明和定义全放在类里面

如果成员函数定义在类中,编译器会将其当作内联函数处理

另一种是类的声明放在.h文件这种,类的定义放在.c文件中(需要注意,成员函数名前需要加类名::)

.h文件

.c文件

成员变量命名规则

为了区分成员函数中的变量是成员变量还是成员函数,我们通常在成员函数前加上 _

类的访问限定符和封装

 c++实现封装的方式,用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

说明:

public修饰的成员可以在类外面使用

protected和private修饰的成员不能在内外直接使用

访问权限作用域是从一个操作符开始开始到下一个操作符,如果没有到 } 结束

class默认权限为private,struct的默认权限是public

面试题

c++中class和struct的区别是什么?

C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来

定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类

默认访问权限是private

封装

面向对象的三大特性:封装,继承和多态

封装:将数据和操作数据的方法进行有机结合,隐藏数据的属性和实现细节,仅对外公开接口和对象进行交互,c++通过类来实现

封装本质是一种管理,类比于电脑主机来说,厂家出厂时在外部套上壳子,将内部隐藏起来,仅提供开关机和接口等让用户与计算机进行交互

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员时需要使用 :: 作用域操作符指定成员属于哪个作用域

类的实例化

用类类型创建对象的过程,称为类的实例化

类是对对象进行描述的,并没有直接分配实际的内存空间

类实例化出来的对象占用实际的物理空间,存储类成员变量

类比于建造房子,类就相当于图纸,实例化出来的对象相当于房子

类对象模型

一个类中既可以存储成员变量,也可以存储成员函数

 内存分配

类中的成员函数放在公共代码区,不计入内存的计算

结论:一个类的大小实际是该类中的成员变量之和,注意内存对齐

空类的大小是一个字节

内存对齐

this指针

在d1,d2分别调用init函数时,为了区分不同对象,c++给每个非静态的成员变量都增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作都是通过该指针去访问用户不需要传递,编译器自己完成

特性

1.this指针的类型是 * const,在成员函数中不能给this赋值

2.this指针只能在函数内部使用

3.this指针本质是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针

4.this指针是成员函数第一个隐含的形参,一般由编译器通过ecx寄存器自动传递,不需要用户传递 

面试题

this指针存储在哪里?

编译器在获取到对象地址后保存在this指针,存放在寄存器ecx中,不同编译器存储位置不同

this指针可以为空么?

this指针可以为空,当我们调用的函数不需要调用对象中的变量时可以为空

1.this为空,没有调用对象中的变量,程序正常运行

2.this为空,调用对象中的变量,程序崩溃

结论:

C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在
类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1145856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣刷题 day58:10-28

1.奇偶位数 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的奇数下标的个数。 返回整数数组 answer ,…

Linux对网络通信的实现

一、NIO为什么很少注册OP_WRITE事件 1、OP_WRITE触发条件:当操作系统写缓冲区有空闲时就绪。一般情况下写缓冲区都有空闲空间,小块数据直接写入即可,没必要注册该操作类型,否则该条件不断就绪浪费cpu;但如果是写密集型…

200smart 物料分拣案例

[TOC]物料分拣 控制系统动作流程 物料为空时,第三个气缸推出 物料为黑色时,第二个气缸推出 物料为白色时,第一个气缸推出 原理 光电传感器起 到位传感器作用 物料为空时,第三个气缸推出 物料为黑色时,第二个气缸…

正则表达式包含数字和字符匹配

至少6位。 pattern : (?.[0-9])(?.[A-Za-z])[0-9A-Za-z]{6,} 正则表达式中的“?”是一个正向预查字符,它的意思是匹配前一个字符出现的最少一次。具体来说,当一个匹配出现时,它会检查前一个字符是否符合要求,如果符合&#xf…

自学爬虫—作业1—requests模块

视频: 要求: 肯德基地址查询,爬某个关键字,获取下面的所有page的信息,存到一个json或者txt。 代码: 关键点,(1)每一个ajax的请求第一个键值对就是所有获得的地址的总数…

IOC课程整理-14 Spring 数据绑定

1. Spring 数据绑定使用场景 2. Spring 数据绑定组件 • DataBinder 绑定方法 • bind(PropertyValues):将 PropertyValues Key-Value 内容映射到关联Bean(target)中的属性上 • 假设 PropertyValues 中包含“name 小裕哥”的键值对&#xf…

关于ABB 机器人多任务的建立

关于ABB 机器人多任务的建立.需要实时监控某一区域,或者某一信号,或者计件到达某一数量机器人自动停止报警,显示到示教器上,多任务可以实现,类似发那科机器人后台逻辑指令 当软件选项漏选或者少选可以选择修改选项&…

redis的bitmap(面试题,待补充)

位图简介 如果我们需要记录某一用户在一年中每天是否有登录我们的系统这一需求该如何完成呢?如果使用KV存储,每个用户需要记录365个,当用户量上亿时,这所需要的存储空间是惊人的。 Redis 为我们提供了位图这一数据结构&#xff…

[AUTOSAR][诊断管理][ECU][$34] 下载请求

文章目录 一、简介二、服务请求报文定义肯定响应支持的NRC三、示例代码34_req_dowload.c一、简介 RequestDownload(0x34)—— 下载请求 这个服务主要是用来给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起下载请求,以完成ECU程序的升级。 二、服务…

python实验2 π的计算

π的计算 1. 圆周率的介绍2. BBP公式计算圆周率3. 蒙特卡洛方法计算π 1. 圆周率的介绍 圆周率π自古就是人们计算的问题,π到底是什么,圆的周长与直径的比值或者是面积与半径的平方之比,或者是使sinx0的最小正数x。所以每一种定义每一种理解…

FreeRTOS 中断管理介绍和实操

目录 中断定义 中断优先级 相关注意 中断相关函数 1.队列 2.信号量 3.事件标志组 4.任务通知 5.软件定时器 中断管理实操 中断定义 中断是指在程序执行的过程中,突然发生了某种事件,需要立即停止当前正在执行的程序,并转而处理这个…

NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)

大致测试一下,发现空格被过滤了 使用内联注释/**/绕过,可行 1/**/-- 使用%a0替代空格,也可以 1%a0-- 再次测试发现等号也被过滤,我们使用 like 代替 (我最开始以为是and被过滤,并没有,如果是…

如何选择适合企业需求的企业知识库管理软件

随着信息技术的不断发展,知识管理软件在企业中扮演着越来越重要的角色。它们帮助企业有效地组织、存储和共享大量的知识资源,提高团队之间的协作效率,并为决策提供有力支持。那企业该如何才能选到合适的企业知识库管理软件呢? 一、…

Unity之ShaderGraph如何实现科幻空气墙

前言 今天在油管上看到一个空气墙的特效,感觉做的非常好看,今天我们就来实现以下这个科幻风格的空气墙 效果如下所示: 点阵 Dots:ShaderGraph的官方示例中提供的点阵SubGraph节点,如下图所示,需要我们导入示例 空气流动 我们让Dots点阵和SimpleNoise相乘,得到一…

JS加密/解密之逻辑运算符加密进阶篇

前言 ​ 前篇给大家介绍了运算符不为人知的基础知识。他们的各种表达形式,今天我们从这个基础上,继续进一步告诉大家,如何对字符串进行加密处理。还是那句话,技术人不废话,直接晒代码。 示例源代码 // 字符串加密示…

【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 引言:一.查看STL使用文档时…

redis6.0源码分析:简单动态字符串sds

文章目录 sds简介与特性(面试)sds结构模型数据结构苛刻的数据优化数据结构优化uintX_t对齐填充 sds优势O(1)时间复杂度获取字符串长度二进制安全杜绝缓冲区溢出自动扩容机制——sdsMakeRoomFor方法 内存重分配次数优化 sds最长是多少部分API源码解读创建sds释放sds sds简介与特…

localhost知识

文章目录 一、localhost是什么?二、localhost 在平时用到的地方三、 localhost 与 127.0.01 一、localhost是什么? localhost 是一个特殊的主机名,通常指代本机。它被用来进行本地开发和测试,也常被用作网络配置中的占位符&#…

IOC课程整理-6 Spring IoC 依赖注入

1 依赖注入的模式和类型 模式 类型 2 自动绑定(Autowiring) 官方定义 “自动装配是Spring框架中一种机制,用于自动解析和满足bean之间的依赖关系。通过自动装配,Spring容器可以根据类型、名称或其他属性来自动连接协作的bean&…

Mac电脑配置Dart编程环境

1.安装Dart SDK 官网地址:https://dart.dev/get-dart $brew tap dart-lang/dart$brew install dart 安装后,用命令检测一下是否安装正常。 $brew info dart 2.VS Code配置Dart环境 1).安装VS Code 官网地址:https://code.visualstudio.c…