C++学习——类和对象(一)

    C++语言和C语言最大的区别在于在C++当中引入了面向对象的编程思想,想要完全了解c++当中的类和对象,就要从头开始一点一点的积累并学习。

    一:什么是面向对象编程

    我们之前学习的C语言属于面向过程的编程方法。举一个简单的例子来说:面向过程的编程就是一步一步的分解一件事情的过程。比如我们想要做一份西红柿炒鸡蛋,按照面向过程的思想来看就是先去买西红柿,之后再洗西红柿,之后会打鸡蛋,接着将我们的西红柿和鸡蛋放到锅里炒,放上各种调料,最后就成为了一份西红柿炒鸡蛋。这样一步一步将一件事情逐步分解,最后达到我们想要的目的的就是面向过程的编程思想。

  而对于我们的面向对象的编程思想按照同样的例子来说就是:我们家楼下有一个饭店,我们只要拿钱就可以去餐厅里面点一份西红柿炒鸡蛋。我们不需要买材料,不需要自己动手做,只需要表达我们的需求,将钱(参数)传递给我们的程序即可。

  从上面的示例当中我们可以发现,面向对象和面向过程编程的区别就在于:对于一件事情的封装与处理是否完善。我们可以将嘞类想象成一个密闭的空间,在这个空间当中包括一件事物的所有特点。包括能进行的行为,所具有的属性。我们可以通过类所创建的对象得出想要的结果。

  利用代码举一个简单的例子:

//定义一个狗类,包括狗的特点以及行为方法
class Dog
{
public:void bark(){std::cout << "小狗汪汪叫" << std::endl;}void wave(){std::cout << "小狗摇尾巴" << std::endl;}
private:char color[20];int age;
};

  我们可以定义一个狗类,当中可以包括狗的颜色以及年龄,(颜色和年龄代表属性)bark和wave表示狗可以进行的行为,(行为表示方法)。

  在类当中我们想要定义特定的属性和我们正常定义的变量是相同的,我们定义的类的方法和我们普通定义的函数也是相同的,所以我们的属性和方法也叫做成员变量和成员函数。

  接下来我们来一步一步来认识类。

二:类的认识

 

  想要定义一个类,观察上面的代码我们可以知道的是,需要先编写一个class表示我们类,紧接着书写一个特定的类名,后面就是类的主体了。在类的主体当中我们还可以细分为几个部分:

  在类的主体当中我们还分为三部分:权限限定符和成员函数以及成员变量。成员函数的定义就和我们普通定义的函数相同,成员变量就和我们普通定义的变量相同,需要着重介绍的就是我们的权限限定符了。

  权限限定符:

   在类当中我们有一部分是想要给外界的使用者进行访问的,但是还有一部分我们不想要让外界进行访问,这个时候我们就需要使用权限访问限定符进行限制访问权限。其中访问限定符分为三种:private(私有),public(公有),protected(保护)我们允许外界访问的就可以设置为public权限,不想要让外界进行访问的就可以设置成为private权限,protected权限我们暂时使用不到所以我们先主要介绍以上两种权限访问限定符。

  就像是我们代码当中展示的那样,我们的权限访问限定符一下的表示都为该权限类型,直到出现新的权限限定符或者直到代码结束为止。所以上面的代码所表示的权限为:

   我们在外界就可以任意的调用公有权限当中的成员函数或者成员变量,但是却不能够使用私有属性的成员函数或者成员变量否则系统就会产生报错。

  在这其中需要着重强调的是,当我们的class没有声明权限访问限定符的时候就会默认成为私有属性。而我们的结构体会默认成为公有属性的类(相信大家都听说过在C++当中将结构体升级成了类)。那么在了解完类之后我们在将我们的目光转向生成的对象上面。

三:对象

  最常规的解释就是我们可以将类想象成为一个图纸,我们根据图纸就可以创建许多房屋,创建好的房屋就代表了一个个的对象。我们可以根据生成的对象进行特定的建造(赋值)等操作。利用代码举一个简单的例子:

#include<iostream>//定义一个狗类,包括狗的特点以及行为方法
class Dog
{
public:void bark(){std::cout << "小狗汪汪叫" << std::endl;}void wave(){std::cout << "小狗摇尾巴" << std::endl;}
private:char color[20];int age;
};
int main()
{Dog dog1;dog1.wave();return 0;
}

   就像是我们上面的代码所展示的那样,Dog表示的是类名,我们使用类名可以创建一个变量,也就是我们经常说的对象。在创建完成对象之后再通过 . 操作符进一步引用类当中的public权限当中的内容。对于同一个类我们可以实例化出多个对象,我们可以创建出一个dog1也可以创建出一个dog2,dog3等等。使用的方法同样和我们的上面的使用方法相同。

  在学会使用类创建对象之后我们需要做的就是完善一下对于类和对象的各方面的细节的地方了。

 四:类和对象细节知识点

 1.类的作用域

  类的作用域实质上和我们的命名空间与很像,假如我们在类当中所创建的成员函数只是一个简简单单的声明的话,那么我们在类外部定义的函数就需要特别指出我们所要作用的类域是哪一个。利用代码来方便我们进行理解:

  我们可以发现我们在类当中仅仅是声明了函数并没有显示定义,那么在外部定义的时候就需要使用类的名称加上我们的域作用限定符进行指定我们想要定义的类即可。运行效果和我们之前的运行效果完全相同。

 2.类的对象大小的计算

  接下来再来认识一下类究竟该如何计算大小。首先我们先来看结果:

  我们可以发现,使用类创建的对象所占空间的大小和我们类的大小完全相同,所以我们就可以将我们的目光转向对类的具体分析上加以理解并证明。

 

  我们会发现在类当中我们定义了两个函数和一个字符型数组,一个整型变量,怎么说都不应该只占24个字节大小的空间呀?经过我们仔细观察我们会发现,仅仅是我们定义的变量就已经占了24个字节了。事实上和我们想的一样,在类里面我们的函数并不占空间。因为我们没有必要对于每一个对象都开辟一个栈帧用于相同的函数,我们只需要创建一个函数之后,每一个对象想要使用函数的时候只需要调用该函数即可。也就是说在类当中我们的成员函数是共享的,所以不需要计算空间。剩下的部分就是我们类所占空间的大小。

  需要特别提出的是:对于我们类当中的成员变量所占字节大小的计算来说其具有一定的对其要求,其对齐要求跟结构体完全相同。如下:

 

  根据对其规则可以得出以上的结果。 

 3.类成员函数的this指针

  作为类和对象入门的最后一部分就是this指针了。在调用我们的成员函数当中系统会向函数的形参当中默认传入一个this指针作为一个隐藏的参数让我们使用。我们可以通过this指针进行访问类当中的所有的变量。当然我们的this指针在成员函数当中也是不需要显示写出的,当我们直接调用成员变量的时候就默认是使用this指针进行引用。(可以显示的写出,但是一般都不写)例子如下:

  由上面的结果我们可以知道我们可以通过直接使用和使用this指针进行引用的方法调用成员变量都是可以的。同样的我们的this指针也可以作为返回值由我们的函数返回进一步使用。 

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

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

相关文章

Elasticsearch--客户端

Es客户端 语言无关 ​ java最常用的客户端是Java Client、Java Rest Client、Java Transport Client Java Client 从es7.17开始&#xff0c;官方推出Java Client&#xff0c;并且将Java Rest Client标为Deprecated&#xff08;过期&#xff09; 要求jdk至少要jdk8 具体用法…

LangChain大型语言模型(LLM)应用开发(六):Agents

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

Ajax详解

文章目录 1. 概述1.1 Ajax工作原理1.2 Ajax的作用1.3 同步异步 2. 原生Ajax3. Axios3.1 Axios的基本使用3.2 Axios快速入门3.3 请求方法的别名 1. 概述 Ajax 是 “Asynchronous JavaScript and XML”&#xff08;异步 JavaScript 和 XML&#xff09;的缩写。它是一种在无需重新…

Java版本企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

决赛结束,颁奖在即:2023隐私计算大会暨“星河杯”隐私计算大赛颁奖典礼震撼来袭!

7月11日-12日&#xff0c;首届“星河杯”隐私计算大赛4个赛题共计37支团队陆续完成决赛评审&#xff0c;决出的大赛获奖团队代表将受邀出席7月26日在青岛星河湾酒店举办的2023隐私计算大会暨首届“星河杯”隐私计算颁奖典礼。 2023隐私计算大会暨首届“星河杯”隐私计算大赛颁奖…

shell脚本中一个隐晦的bug

1.逻辑表达式if [ ! EXP PATTERN ]不能判断EXP结果为空的情形&#xff1b; 2.而逻辑表达式if [[ EXP ! PATTERN ]可以判断EXP结果为空的情形&#xff1b;

计算机网络 day10 DNAT问题 - 堡垒机 - WLAN

目录 DNAT策略拓扑图&#xff1a; 问题一&#xff1a;当我们访问内网的Web服务的时候&#xff0c;我们防火墙服务器的80端口和Web服务器的8000端口是否需要一直调用程序监控呢&#xff1f; DNAT的作用就是可以帮助我们进行路由转发功能 问题二&#xff1a;当我们在继续DNAT…

【VUE】拖动侧边栏以便自由调整左右两侧的宽度

效果 &#xff08;1&#xff09;拖动前 &#xff08;2&#xff09;拖动后 主要代码 <template><el-row class"contnet" :gutter"20">// 1. 左侧树<el-col id"left-tree" class"left-tree" :offset"0" :…

什么是 Elasticsearch 索引?

作者&#xff1a;David Brimley 索引这个术语在科技界已经被用满了。 如果你问大多数开发人员什么是索引&#xff0c;他们可能会告诉你索引通常指的是关系数据库 (RDBMS) 中与表关联的数据结构&#xff0c;它提高了数据检索操作的速度。 但什么是 Elasticsearch 索引&#xff…

利用Python与ArcGIS工具进行蒸散发ET、植被总初级生产力GPP估算

查看原文>>>基于”Python”多技术融合在蒸散发与植被总初级生产力估算中的实践应用 熟悉蒸散发ET及其组分&#xff08;植被蒸腾Ec、土壤蒸发Es、冠层截留Ei&#xff09;、植被总初级生产力GPP的概念和碳水耦合的基本原理&#xff1b;掌握利用Python与ArcGIS工具进行课…

一篇文章教会你,在IntelliJ IDEA 中,一些让你相见恨晚的技巧

1.Easy Code Easy Code我个人在写博客案例demo时用的比较多&#xff0c;它可以快速的将数据库表映射成Java中的entity、controller、service、dao、mapper等文件&#xff0c;少量编码实现快速开发。 先用database连接数据库&#xff0c;在对应表上直接右键执行EasyCode即可生成…

【PostgreSQL内核学习(三)—— 查询重写】

查询重写 查询重写系统规则视图和规则系统ASLO型规则的查询重写规则系统与触发器的区别 查询重写的处理操作定义重写规则删除重写规则对查询树进行重写 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c…