C++入门:类和对象(上)

news2024/10/5 22:22:43

目录

前言:

一:初识面向过程和面向对象

二:类的引入

三:封装和类的访问限定符

(1)封装

(2)访问限定符

四:类的作用域和类的定义

(1)作用域

(2)类的定义

五:类的实例化(对象)

六:类对象的存储模型

(1)结构体内存对齐

(2)对象及其成员函数的存储模型

七:this指针

(1)引例:

(2)成因

(3)this指针的特性


前言:

C++专栏内容连贯,没展开讲的重要内容都在专栏往期。

为方便语法学习,直接展开std命名空间。

个人主页链接:https://blog.csdn.net/2301_76269963?type=blog


一:初识面向过程和面向对象

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

以洗衣服这个事情为例子:


C++是面向对象的,关注的是对象,将一件事情涉及到的对象分离出来,依靠对象间的交互来解决问题。


二:类的引入

在C语言中,我们会用结构体来表示一些较复杂的事物,但是结构体中只能声明变量,不能声明和定义函数,C++中引入了类的概念,在结构体的基础上声明或者定义函数,我们称为类。


struct关键字虽然可以用来定义类,但是C++中定义类更喜欢用class关键字

(涉及到封装和兼容性)

这里成员函数都是直接在类中定义的,声明定义分离的写法等把访问限定符和域讲完了再来说。


三:封装和类的访问限定符

(1)封装

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

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

封装本质上是一种管理,其目的是让用户更方便使用类。比如:对电脑这样复杂的设备,用户只需要使用开关机键、键盘、鼠标等就可以和电脑进行交互了,完成日常事务了。但是电脑上实际工作的却是CPU、内存、显卡这些硬件。
对使用者来说,不需要关心内部的实现细节,设计者也不希望使用者触及到内核,因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可

那么C++是如何实现细节隐藏的呢?

(2)访问限定符

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

 

三个访问限定符:

 

访问限定符的说明:

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

    2.protected和private修饰的成员在类外不能直接被访问(此处protected和private类似)

    3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

    4.如果后面没有访问限定符,作用域就到 },即类结束

    5.class定义的类的默认访问权限为private,struct为public(因为struct要兼容C)


四:类的作用域和类的定义

(1)作用域

C++中用{ }括起来的部分都可以称为一个域。

为了加深理解,我举个例子:


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

(2)类的定义

类的两种定义方式:
【1】声明和定义都放在类体中(注意:如果函数在类体中定义,会被当成内联函数处理)。
【2】声明定义分离,类体中只有声明,大多数情况下适合用这种(注意:分离的话定义处函数名前面要加类名::)。


成员变量命名规则的建议:

混乱的写法:

 正常的写法:


五:类的实例化(对象)

类和对象的关系就像房屋和设计图纸一样,其中类是设计图纸,对象是借由这个图纸建立的房屋。图纸说明了房屋大概需要什么材料,并没有像房屋一样成为占用大量空间的实体,所以类只是说明了类中都有什么成员,并没有占用内存空间,实例化出的对象才占用了空间


六:类对象的存储模型

(1)结构体内存对齐

涉及到对象大小计算,先介绍一下结构体内存对齐。

一:对齐的规则

【1】结构体内的成员变量会按照定义顺序依次存放,其中第一个成员在结构体变量偏移量为0的地址处

【2】每个成员变量的起始地址必须是对齐数的整数倍,对齐数为编译器默认对齐数与该成员大小中较小的一方,如果不足则补齐到整数倍。

(我用的是VS,默认对齐数为8)

【3】结构体的总大小必须是结构体中最大成员的大小的整数倍,如果不足则补齐到整数倍。

【4】如果结构体成员有数组,则规则适用于数组中的每个元素。


几个题目

图解:


图解:


图解:

(2)对象及成员函数的存储模型

如果每个对象都一份保存相同的函数代码,当一个类实例化多个对象时,相同代码保存多次,无疑是浪费空间的,所以采用了下面的存储方法。


七:this指针

(1)引例:

 

(2)成因

C语言中,要借由函数改变结构体变量的值,必须传它的指针

我们已经知道类的成员函数是存储在公共区的,不是某一个对象的私有,C++是如何实现直接访问并修改的呢?

原因很简单,C++编译器给每个“非静态的成员函数“(不加static)增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的访问,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成解引用的操作。

我们回过头来看上面的题目:

 

(3)this指针的特性

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

(const修饰在 * 之后,代表指针这个值本身不能更改)

2. 只能在“成员函数”的内部使用

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

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

5.虽然编译器会自动实现解引用操作,但是手动解引用访问成员变量也是支持的。不能手动传this指针这个隐藏的参数

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

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

相关文章

代码随想录第58天

1.每日温度: 1.什么时候用单调栈呢? 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。 2.单调栈里元素是递增呢? 还是递减呢? 注意以…

阿里云服务器解析绑定后访问不了的变态策略

阿里云服务器默认把80端口毙掉了,说是为了服务器安全。 客户买个一般服务器不就是弄个网站,80或者443端口默认还需要自己打开。 好比买个车,为了安全,没有轮胎,怕客户跑起来撞人,买完车让客户自己安装轮胎。…

Redis常见问题、各个分布式锁优缺点-05

Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数? 因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。 奇数个ma…

BLIP和BLIP2

文章主要是对BLIP2 (使用冻结图像编码器和大型语言模型的Bootstrapping语言图像预训练)论文的阅读笔记,也对BLIP(用于统一视觉语言理解和生成的Bootstrapping语言图像预训练)算法进行了简单的介绍。 一、BLIP&#xf…

走进人工智能| Computer Vision 数字化时代的视觉启示录

前言: 计算机视觉是通过模仿人类视觉系统的工作原理,使计算机能够感知、理解和解释图像和视频的能力。 文章目录 序言背景适用领域技术支持应用领域程序员如何学总结 序言 计算机视觉是人工智能领域的一个重要分支,它涉及使计算机能够“看”…

nginx的开始(一)---nginx的安装

文章目录 1.nginx是什么?2.nginx安装2.1.安装准备:2.2.进行安装:2.2.1.apt安装(快速)2.2.2.源码安装 2.3.配置文件简解(nginx.conf) 1.nginx是什么? Nginx(发音为"e…

AndroidT(13) init 进程 -- first stage init 的初始化 (二)

1.概览 第一阶段的 init 工作主要用于读取系统启动阶段需要的配置信息(例如 linux的bootconfig,cmdline等配置信息)、挂载文件系统、安装 kernel 中的模块驱动,最后就是启动第二阶段的 init 来进行 Android 系统相关的组件。第一阶段的 init …

《微服务实战》 第三十章 分布式事务框架seata TCC模式

前言 本章节介绍分布式事务框架seata TCC模式,上一章节介绍seata以及集成到Springboot、微服务框架里。 1、TCC模式 一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要…

如何利用ChatGPT写毕业论文

如何利用ChatGPT写毕业论文 ChatGPT是什么?利用ChatGPT写毕业论文的步骤1.准备数据2.训练模型3.生成论文4.检查论文 总结地址 ChatGPT是什么? ChatGPT是一个基于GPT-2模型的开源聊天机器人,它可以回答用户的问题,进行闲聊和提供各…

或许是一个新的算法方向?

动动发财的小手,点个赞吧! 今日谷歌 DeepMind 使用深度强化学习发现更快的排序算法,相关论文[1]成果已经发表在Nature上。 据报道:该算法可以提速 70%,相比之下,快了3倍之多。 摘要 排序或散列等…

230611-通过Doxygen实现项目代码的文档自动化生成(Mac+Win通用)

背景介绍 目前主流的Python项目的文档管理多通过Sphinx实现;当前Sphinx尚未有针对C#等代码的插件;若想对C#的项目代码进行Sphinx的管理,可通过Doxygen导出为xml文件,进行二次转换;有关Doxygen的介绍及使用&#xff0c…

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例 一、Opencv大图找小图说明二、Opencv的window安装1.下载windows下的安装包2.安装3.Java中Opencv加载测试 三、Java中通过Opencv进行模板匹配大图找小图四、进行多图查找五:案例下载bilibili视…

碳排放预测模型 | Python实现基于机器学习回归分析的碳排放预测模型——随机森林、决策树、KNN 和多层感知器 (MLP) 预测分析

文章目录 效果一览文章概述研究内容环境准备源码设计KNNRandom ForestDecision TreeMLPModel Evaluation学习总结参考资料效果一览

【Android开发基础】随机点名系统(关于读取xml资源文件)

文章目录 一、引言二、设计1、读取xml2、下拉框Spinner3、随机算法 三、实施1、子元素随机(单位:班级)2、父元素随机(单位:专业)3、指定人数随机4、指定人数混合排序 四、附件 一、引言 描述:这…

【手撕MyBatis源码】动态SQL全流程解析

文章目录 动态SQL概述ifchoose(when、otherwise)trim(where、set)foreach OGNL表达式BoundSql动态SQL主流程分析SqlNodeDynamicContext源码解析StaticTextSqlNodeTextSqlNodeIfSqlNodeChooseSqlNodeForEachSqlNode 动态脚本结构动态脚本执行 SqlSourceSt…

Spring Cloud - Eureka原理、注册、搭建、应用(全过程详解)

目录 一、Eureka 注册原理 1.1、为什么要使用 Eureka 1.2、Eureka 的工作流程及原理 1.3、eureka 的作用 二、具体实现 2.1、搭建注册中心 2.2、服务注册和部署 2.2.1、user-service 服务注册 2.2.2、服务部署 2.2.3、order-service 服务注册 2.2.4、验证服务 2.3、…

java SSM 药品集中管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 药品集中管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

[神经网络]迁移学习-微调

一、概述 一般的有监督迁移学习分为以下三种: ①将训练好的模型作为特征抽取模块(例如以resnet进行特征提取) ②在一个相关的任务中训练后直接后直接使用(例如gpt) ③在训练好的模型基础上进行微调 此外还有无监督学习的方式 zero-shot&#…

【集群】LVS+Keepalived群集

文章目录 前言一、Keepalived的概念1. Keepalived 概述2. Keepalived 作用3. Keepalived 实现原理剖析3.1 Keepalived 工作原理3.1 VRRP协议(虚拟路由冗余协议) 4. Keepalived 主要模块及其作用4.1 健康检查方式(学名:探针&#x…

【架构基础】正交设计四原则

数学中的正交,是指相互垂直的两个向量,简单来讲就是平面上的两个垂直线段,其中一个线段变长或减短或者转圈圈,另外一根是不变的也不影响它们的垂直度的。表现为空间的独立性,在软件中我们可以理解为两个只有交叉点而互…