C++类与对象(上)

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🐻‍❄个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🕊系列专栏:零基础学习C语言----- 数据结构的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉
————————————————

🎉文章简介:

本篇文章对   c++类和对象(上)   学习的相关知识进行分享!

类和对象   分为三篇, (上,中,下), 这是 类和对象(上)篇

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉


目录

一.面向过程与面向对象初步认识

二.类的引入

类的特点:

三.类的定义 

class关键字

类的两种定义方式

1.声明和定义全部放在类体中

2.声明与定义分离:

四.类的访问限定符

五.类的实例化

六.类对象的存储

1.类对象的存储方式 

2.计算类的大小

3.内存对齐的规则

面试题:

七.this指针

this指针的特性:

面试题:


一.面向过程与面向对象初步认识

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

就像洗衣服这个问题:如果是面向过程可能会经历一下过程:

2.c++是基于面向对象的,关注的是对象,将一件事情拆分不同的对象,靠对象之间的交互完成,不需要去关注是怎么完成的;

就以洗衣服为例,将洗衣液,衣服放进洗衣机,启动后,过一会,洗衣机自动将衣服洗干净,我们不需要去关注洗衣服的步骤,衣服是怎么被洗干净的;在这个过程中,

对象有四个:人,衣服,洗衣液,洗衣机,人将衣服和洗衣液放进洗衣机,他们之间交互完成对衣服的清洗;

二.类的引入

struct在C语言中的所有用法,在c++都适用,同时,struct在c++中升级成了

类的特点:

1.类名就是类型

2.类里面可以定义函数

三.类的定义 

class关键字

在c++中,相对于struct而言,更喜欢用class,class为定义的关键字;

class定义的类默认是私有

class为定义类的关键字,classname是类的名字,{ }中为类的主体

类体中有成员变量成员函数组成;

类的两种定义方式

1.声明和定义全部放在类体中

声明和定义全部放在类体中,成员函数如果定义在类中,编译器可能会将其当成内联函数处理。

2.声明与定义分离:

与C语言不同的是:在定义中需要加域作用限定符指定是在哪里的函数

四.类的访问限定符

访问限定符

有三个:1.public   (共有)

               2.protected(保护)

               3.private(私有)

说明:

1.public 修饰的成员在类外面可以直接被访问;

2.private protected 修饰的成员在类外面不能直接被访问,在类里面可以访问;

3.访问权限作用域  从该访问限定符出现的位置到下个访问限定符出现为止,如果后面没有访问限定符,则到 } 即类结束;

4.其中class默认的是private(私有),struct为public(共有)

注意:访问限定符只在编译有用,当数据映射到内存后,没有任何访问限定符上的区别; 

 例如:

C++中struct和class的区别?

c++需要兼容c语言。所以c++中struct可以当成结构体使用,另外c++中struct还可以定义类。和class定义类是一样的,区别是struct定义的类默认反访问权限是public,class定义的默认访问权限是private。还有一些区别在继承和模板参数列表那里,后面学习中会提到;

五.类的实例化

用类类型创建对象的过程,就是类的实例化

1.类对象的关系是:一个类可以定义多个对象

2.就像是设计图,限定了房子里面有哪些东西,但是没有实体的建筑存在,不能存储数据

3.定义出来的对象就好比是用设计图造出来的房子,占用实际的空间,存储类成员变量;     

六.类对象的存储

1.类对象的存储方式 

只保存成员变量成员函数放在公共的代码段

如果成员函数也放保存在类里面,这样用该类类型创建很多个对象时,调用函数就需要call很多次地址,会造成空间的浪费;

放在公共代码段上,需要调用时,直接在公共代码段上去找,调用就可以了;

 

2.计算类的大小

1.一个类的大小,实际就是该类中成员变量的之和的大小,但是需要考虑内存对齐;

2.注意:空类 / 无成员变量的类  的大小是一个字节

3.内存对齐的规则

1.第一个成员在与结构体偏移量为0的地址处;

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;

注意:对齐数=编译器默认对齐数与该成员变量的较小值(Vs的默认对齐数为8)

3.结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍;

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的

整体大小就是所有最大数对齐数(含嵌套结构体的对齐数)的整数倍;

面试题:

1.结构体怎么对齐?为什么要进行内存对齐?

2.如何让结构体按照指定的对其参数进行对齐?能否按照3,4,5即任意字节对齐?

3.什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景;

七.this指针

c++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有"成员函数"的操作,都是通过this指针去的访问的,用户不需要来传递,比那一起自动完成;

先看一下这样的代码:

实际上编译器会处理成这样:

this指针的特性:

1.不能显示的写this相关的形参和实参;

2.每一个成员函数的参数都有一个this指针;

3.this指针的类型: 类类型 *const  ; 即成员函数中,不能给this指针赋值

const在*之后,修饰的是指针 ; 在*之前,修饰的是指针指向的对象;

4.只能在成员函数的内部使用;

5.this指针是成员函数第一个隐含的指针参数

面试题:

1.this指针存储在哪里?

this指针是个形参,存放在栈帧里面的;在Vs上存储在寄存器上的;

2.this指针可以为空吗?



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

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

相关文章

数据结构—小堆的实现

前言:前面我们已经学习了二叉树,今天我们来学习堆,堆也是一个二叉树,堆有大堆有小堆,大堆父节点大于子节点,小堆父节点总小于子节点,我们在学习C语言的时候也有一个堆的概念,那个堆是…

通过互联网代理部署Docker+Kubernetes 1.28.1

一、背景 在公司环境中,我们往往都是无法直接连接外网的,之前写过一篇文章,是通过外网自建的中转机器下载需要的离线包,并在内网搭建一个harbor,通过harbor的方式搭建了一个kubernetes,但是这种方式还是有…

医学检验科LIS系统源码 样本采集、检验、分析

LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器,通过计算机联网,实现各类仪器数据结果的实时自动接收、自动控制及综合分析;系统可与条码设备配套使用,自动生成条码,减少实验室信息传递中人为因素导致的误…

鸿蒙开发-ArkTS 语言-基础语法

1. 初识 ArkTS 语言 ArkTS 是 HarmonyOS 优选主力开发语言。ArkTS 是基于 TypeScript (TS) 扩展的一门语言,继承了 TS 的所有特性,是TS的超集。 主要是扩展了以下几个方面: 声明式UI描述和自定义组件: ArkTS使用声明式的方式描述用…

MySQL-03-索引

索引是提高MySQL查询性能的一个重要途径,但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用,从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引,因为事后可能需要监控大量的SQL才能定位到问题所在,而且添加索…

YB4556 28V、1A、单节、线性锂电池充电IC

YB4556 28V 、 1A 、单节、线性锂电池充电 IC 概述: YB4556H 是一款完整的采用恒定电流 / 恒定电压的高压、大电流、单节锂离子电池线性充电 IC。最高耐压可达 28V,6.5V 自动过压保护,充电电流可达 1A。由于采用了内部 PMOSFET 架构,加上防倒…

鸿蒙开发-ArkTS 语言-循环渲染

鸿蒙开发-ArkTS 语言-状态管理 4. 渲染控制 对于 UI 渲染,可以基于数据结构选择一些内置方法(例如:ForEach)快速渲染 UI 结构。 4.1 if-else条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使…

软著项目推荐 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Shell编程基础 – 变量(Variables)

Shell编程基础 – 变量(Variables) Shell Scripting Essentials – Variables Bash变量作为shell脚本的重要组成部分,提供了在Unix/Linux命令行界面操作和保存数据的方法。 本文简要介绍Bash Shell脚本变量的基础知识以及应用,包…

python实现炫酷的屏幕保护程序!

今天写了桌面保护程序。先来看看效果吧。 完全可以作为屏保程序了,老方式:以下是实现的代码: from tkinter import *from time import strftime​def update_time():global i, j current_time strftime(%H:%M:%S)time_label.config(textcu…

arp报文及使用go实现

一、ARP协议报文格式及ARP表 ARP(Address Resolution Protocal,地址解析协议)是将IP地址解析为以太网的MAC地址(或者称为物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备…

开源语音大语言模型来了!阿里基于Qwen-Chat提出Qwen-Audio!

论文链接:https://arxiv.org/pdf/2311.07919.pdf 开源代码:https://github.com/QwenLM/Qwen-Audio 引言 大型语言模型(LLMs)由于其良好的知识保留能力、复杂的推理和解决问题能力,在通用人工智能(AGI&am…

现代图标集wxArtProvider发布 —— 发布于2023年11月21日

Perazz发布了wxMaterialDesignArtProvider,这是一个自定义的wxArtProvider类,从MaterialDesign、SimpleIcons、FontAwesome和FluentUI系统数据集中提供基于SVG的图标。所有这些数据集都有许可证(MIT、CC BY 4.0、CC0 1.0、Apache 2.0&#xf…

打破障碍:2024年赋能企业人工智慧生成创新-5个应用场景与6个转型步骤

想要了解如何采用生成式AI来提高企业效率和竞争力?本指南将介绍如何采用生成式AI来实现数字化转型,并打造智能化商业模式。从5大应用场景和6大步骤切入,让您了解如何开启生成式AI创新。立即连线创新专家咨询或观看创新战略方案视频进一步了解…

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…

【spring(五)】SpringMvc总结 SSM整合流程

目录 一、SpringMVC简介&#xff1a; 二、SpringMVC快速入门&#xff1a; 三、SpringMVC bean的管理&#xff1a;⭐ ①配置bean ②扫描bean 四、SpringMVC配置类&#xff1a;⭐ 五、SpringMVC 请求与响应 六、SpringMVC REST风格 七、SSM整合 异常处理&#xff1a; 八、…

今日现货白银价要素分析

现货白银市场每天走势图上的K线&#xff0c;都是由开盘价、收盘价、最高价、最低价四个价格要素组成。K线作为一种特殊的市场语言&#xff0c;不同具体的形态有不同的含义&#xff0c;当收盘价高于开盘价就形成阳线&#xff0c;反之就形成阴线。 如果阳线出现在银价盘整或行情下…

位图的详细讲解

位运算操作符&#xff1a;或&#xff0c;与&#xff0c;异或&#xff0c;按位取反。 操作符 |两个中有一个是一则为一&两个都是一则为一^相同为零&#xff0c;不同为一~零变成一&#xff0c;一变成零 什么是位运算符: 位运算是直接对整型数据的二进制进行运算。 位图概念…

基于UI交互意图理解的异常检测方法

美团到店平台技术部/质量工程部与复旦大学周扬帆教授团队开展了科研合作&#xff0c;基于业务实际场景&#xff0c;自主研发了多模态UI交互意图识别模型以及配套的UI交互框架。 本文从大前端质量保障领域的痛点出发&#xff0c;介绍了UI交互意图识别的方法设计与实现。基于UI交…

告别百度网盘,搭建自己的专属网盘 ——Cloudreve,不限制下载速度!

Cloudreve 是一个用 Go 语言写的公有网盘程序,我们可以用它来快速搭建起自己的网盘服务,公有云 / 私有云都可。 顺哥博客 先来看看文档介绍吧。 支持多家云存储驱动的公有云文件系统. 演示站 • 讨论社区 • 文档 • 下载 • Telegram 群组 • 许可证 :sparkles: 特性 :cl…