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

news2024/9/22 13:45:15

    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.coloradmin.cn/o/759359.html

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

相关文章

Linux地盘上AMD处理器称王了

近日资讯&#xff0c;尽管从全局来看&#xff0c;Linux系统份额远不及Windows&#xff0c;但在程序员、开发者、硬核玩家圈子&#xff0c;Linux则备受推崇。 来自Steam的最新数据显示&#xff0c;在Linux游戏用户中&#xff0c;AMD处理器的份额占据绝对优势&#xff0c;达到了…

Spring Cloud—GateWay之限流

RequestRateLimiter RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许&#xff0c;就会返回 HTTP 429 - Too Many Requests&#xff08;默认&#xff09;的状态。 这个过滤器需要一个可选的 keyResolver 参数和特定于…

cpuset.cpus.effective: no such file or directory (修改 docker cgroup 版本的方法)

要切换使用 v1 版 cgroup&#xff0c;需要做如下配置&#xff1a; vim /etc/default/grubGRUB_CMDLINE_LINUX"systemd.unified_cgroup_hierarchy0"update-grubreboot完美解决

【条件与循环】——matlab入门

目录索引 if&#xff1a;else与elseif&#xff1a; for&#xff1a; if&#xff1a; if 条件语句块 endelse与elseif&#xff1a; if 条件代码块 elseif 条件代码块 else 代码块 endfor&#xff1a; for 条件循环体 end在matlab里面类似的引号操作都是包头又包尾的。上面的c…

TypeScript基础篇 - TS介绍

目录 Typescript的定义 type.ts 深入了解Typescript Typescript应该学到什么程度&#xff1f; Typescript学习方法 如何学好TS 小节&#xff1a;常见学习误区 一张ai生成图~ Typescript的定义 2012年微软发布的一门编程语言 Transcompiler【翻译编译器】Typescript——…

操作符详解(2)

文章目录 8. 条件操作符9. 逗号表达式10. 下标引用、函数调用和结构成员11. 表达式求值11.1 隐式类型转换11.2 算术转换11.3 操作符的属性 附&#xff1a; 8. 条件操作符 exp1 ? exp2 : exp3 int main() {int a 0;int b 0;if (a > 5){b 3;}else{b -3;}//(a > 5) ? …

【Elasticsearch】黑马旅游案例

目录 4.黑马旅游案例 4.1.酒店搜索和分页 4.1.1.需求分析 4.1.2.定义实体类 4.1.3.定义controller 4.1.4.实现搜索业务 4.2.酒店结果过滤 4.2.1.需求分析 4.2.2.修改实体类 4.2.3.修改搜索业务 4.3.我周边的酒店 4.3.1.需求分析 4.3.2.修改实体类 4.3.3.距离排序…

linux学习笔记(1)----基础知识

1.linux用户 ubuntu有三种用户&#xff1a; 1&#xff09;初次创建的用户 2&#xff09;root用户 3&#xff09;普通用户 linux用户记录在etc/passwd这个文件内 linux用户密码在etc/shadow这个文件内 2.linux用户组 为了方便管理&#xff0c;将用户进行分组&#xff0c…

.NET Native AOT的静态库与动态库

.NET不仅可以使用 C静态库与动态库&#xff0c;也可以将.NET实现的函数导出为C静态库与动态库。在没有Native Aot之前&#xff0c;.NET只能通过P/Invoke享受C/C生态&#xff0c;而在Native Aot之后&#xff0c;不仅可以享受这些生态&#xff0c;还可以开发SDK供其他语言调用。 …

多层、六边形、洋葱和clean架构简介

想想回到过去的美好时光&#xff0c;根本没有所谓架构&#xff0c;那些日子是多么幸福啊&#xff0c;只有了解 GoF 模式&#xff0c;你就能称自己为架构师。 然而&#xff0c;计算机变得更加强大&#xff0c;用户的需求增加&#xff0c;导致应用程序的复杂性增加。 开发人员解决…

一场内容生产的革命 :从PGC、UGC到AIGC

1 概念解读 1.1 什么是PGC&#xff1f; PGC 是指专业生成内容&#xff08;Professional Generated Content&#xff09;&#xff0c;是由专业的内容创作者或团队进行创作、编辑和发布的内容。PGC创作方式起源于传统媒体时代&#xff0c;如报纸、杂志、电视和电影等&#xff0…

低代码技术在各大行业中的应用探讨

随着低代码开发平台的兴起&#xff0c;越来越多的企业开始探索和采用这一技术&#xff0c;以加速应用程序的开发和数字化转型。低代码开发平台的优势在于简化和加速开发过程&#xff0c;降低了技术门槛&#xff0c;使得非专业开发人员也能参与应用程序的创建。在本篇文章中&…

Linux下挂载NFS服务

描述&#xff1a;在Linux下把文件挂在到Linux开发板中实现文件共享 准备步骤&#xff1a;Ubuntu和一块Linux开发板 网络环境&#xff1a;确保在同一个网段&#xff1a;例如192.168.1.226 和192.168.3.226 是不同的网段 NFS介绍 网络文件系统&#xff0c;英文 Network File …

Linux上安装和使用SSH工具

文章目录 前言一、安装SSH Server1. 安装ssh安装包2. 启动ssh3. 设置ssh开机启动 二、 检查SSH状态三、备注 前言 SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务&#xff0c;…

MySQL 的全局锁、表锁和行锁

在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁&#xff0c;其中行级锁只提了概念&#xff0c;并没有具体说。 因为行级锁加锁规则比较复杂&#xff0c;不同的场景&#xff0c;加锁的形式还不同&#xff0c;所以这次就来好好介绍下行级锁。 对记录加锁时&#xff0c;加…

PyTorch模型安卓部署流程(NCNN)

上一篇介绍了PyTorch模型部署流程&#xff08;Onnx Runtime&#xff09;的相关部署流程,再来简单的回顾一下~ 深度学习模型部署介绍 模型部署指让训练好的深度学习模型在特定环境中运行的过程。模型部署会面临的难题&#xff1a; 运行模型所需的环境难以配置。深度学习模型通…

驱动设备的IOCTL

一、ioctl操作实现 已知成员的地址获得所在结构体变量的地址&#xff1a; container_of(成员地址,结构体类型名&#xff0c;成员在结构体中的名称) long xxx_ioctl (struct file *filp, unsigned int cmd, unsigned long arg); 功能&#xff1a;对相应设备做指定的控制操作&…

GB28181设备接入侧录像查询和录像下载技术探究之实时录像

技术背景 我们在对接GB28181设备接入侧的时候&#xff0c;除了常规实时音视频按需上传外&#xff0c;还有个重要的功能&#xff0c;就是本地实时录像&#xff0c;录像后的数据&#xff0c;在执法记录仪等前端设备留底&#xff0c;然后&#xff0c;到工作站拷贝到专门的平台。 …

订单系统、报名、预约、表单系统 定制开发功能展示

安装教程环境说明&#xff1a;正常情况下PHP5.3-5.6、阿帕奇、mysql安装即可 安装说明&#xff1a; 1、上传源码压缩包到网站根目录&#xff08;这个请去问下空间商哪个是根目录&#xff0c;每家服务器商不一样&#xff0c;我们也不能确定&#xff0c;请确定是根目录再安装&am…

Java设计模式之行为型-解释器模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 解释器模式是指给定一个语言&#xff08;表达式&#xff09;&#xff0c;来表示它的文法&#xff0c;并定义一个解释器&#xff0c;使用该解释器来解释语言中的句子&#xff08;表达式&a…