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.mzph.cn/news/1090.shtml

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

相关文章

使用npm和nrm查看源和切换镜像

一、使用npm查看当前源、切换淘宝镜像、切换官方源 &#xff08;1&#xff09;npm查看当前源&#xff1a; npm get registry &#xff08;2&#xff09;npm设置淘宝镜像源&#xff1a; npm config set registry http://registry.npm.taobao.org &#xff08;3&#xff09;n…

【运维工程师学习三】Linux中Shell脚本编写

【运维工程师学习三】shell编程 Shell程序分类1、系统中sh命令是bash的软链接2、Shell脚本标准格式之文件后缀3、Shell脚本标准格式之文件内容首行4、Shell脚本的运行方法一、作为可执行程序解释 二、作为解释器&#xff08;bash&#xff09;参数 5、find、grep、xargs、sort、…

网络协议与攻击模拟-17-DNS协议-报文格式

二、DNS 查询 客户机想要访问www.baidu.com&#xff0c;根据自己的 TCP / IP 参数&#xff0c;向自己的首选 DNS 服务器发送 DNS 请求 首选 DNS 收到客户机的请求后&#xff0c;会去查询自己的区域文件&#xff0c;找不到www.baidu.com的 IP 地址信息&#xff08;将请求转发到…

MYSQL 5.7.17 安装版 的配置文件

解压版解压后都有 my.ini配置文件&#xff0c;安装版要查找这个配置文件可以查看 MYSQL Workbench --> 左侧 INSTANCE --> Options File &#xff0c;然后可以看到底部 Configuration File所处的位置&#xff0c;即为my.ini的路径。

Jupyter notebook添加与删除kernel

目录 1 添加虚拟环境的kernel 2 删除jupyter notebook已有的kernal 3 切换内核与查看当前内核 4 添加C语言的kernel 5 添加python2的kernel 6 添加java语言的kernel 6.1 sudo apt install default-jre 6.2 下载并安装 ijava 6.3 sudo apt install openjdk-11…

TortoiseGit 入门指南05:推送和拉取

本节所讲内容均涉及到 远端版本库。 版本库 的概念在《TortoiseGit 入门指南02&#xff1a;创建和克隆仓库》中提到过&#xff0c;它是工作目录下面的一个名为 .git 的隐藏目录&#xff0c;我们每一次提交、每一个分支都会保存在版本库中。这个版本库就在我们电脑上的某个文件…

鸽了百万用户四年的赛博皮卡终于要来啦

作者 | Amy 编辑 | 德新 本月15号&#xff0c;特斯拉官方宣布&#xff0c;第一辆 赛博皮卡已在特斯拉得州工厂下线。 而就在本月初&#xff0c;马斯克还发推预热了一波&#xff0c;「开着赛博皮卡在奥斯汀&#xff08;特斯拉得州工厂所在地&#xff09;溜了一圈&#xff01…

THREE.JS镜头随鼠标晃动效果

为了让动画更灵活并且简单 借助gsap让其具有更多可能&#xff0c;在未来更容易扩充其他动效 gsap Dom跟随鼠标移动 gsap.quickTo() 首先要监听鼠标移动&#xff0c;并且将移动的值转换到 -1 和 1 之间 方便处理 private mousemove(e: MouseEvent) {const x (e.clientX / inner…

华为配置LLDP基本功能

华为配置LLDP基本功能 1.什么是lldp协议 定义 LLDP(Link Layer Discovery Protocol)是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式,可以将本端设备的管理地址、设备标识、接口标识等信息组织起来,并发布给自己的邻居设备,邻居设备收到这些信息后将…

SSH远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试8. SSH固定地址连接测试 转载自cpolar极点云文章&#xff1a;SSH远程直连Docker容器 在某些特殊需求下,我们想ssh…

45、Spring Boot自动配置原理

Spring Boot自动配置原理 lmport Configuration Spring spi 自动配置类由各个starter提供&#xff0c;使用Configuration Bean定义配置类&#xff0c;放到META-INF/spring.factories下使用Spring spi扫描META-INF/spring.factories下的配置类使用lmport导入自动配置类

[游戏开发][Unity] TPS射击游戏相机实现

技术难点&#xff1a;由于是第三人称射击游戏&#xff0c;角色和相机之间有夹角&#xff0c;所以枪口点和准星是有误差的&#xff0c;下面是和平精英手游截图&#xff0c;我用AK射击zhuzi using System.Collections; using System.Collections.Generic; using UnityEngine;publ…

❤️创意网页:如何创建一个漂亮的3D正六边形

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

上手vue2的学习笔记5之在vue2项目中调用elment-ui

前言 上手vue2的学习笔记4之搭建vue环境 参考链接&#xff1a;vue2.0项目引入element-ui 一、安装elment-ui 进入搭建的vue项目中 cd vue_bing_test 安装 element npm i element-ui二、引入elment-ui elment官方教程 将main.js改成如下内容&#xff1a; import Vue fro…

我们正在开发一套组件库,欢迎你的加入~

项目地址 github地址 可以先点进来康康~ 技术栈 目前我们整体采用的是vue3typescriptless作为整体的开发的选择 需要说的是&#xff0c;我们并没有采用很多组件库采用的TSX的写法&#xff0c;而是选择了SFC的写法&#xff0c;这是因为我们觉得对于大部分的vue开发者来说&am…

MySQL八股学习记录4事务的实现from小林coding

MySQL八股学习记录4事务的实现from小林coding 事务的概念与特性并行事务引发的问题脏读不可重复读幻读 MySQL的应对策略InnoDB引擎可重复读详解ReadView在MVCC中的工作方式两种隔离级别通过MVCC实现幻读被完全解决了吗 事务的概念与特性 概念:一个操作要么执行成功,要么回滚到…

ORACLE实时SQL监控视图

引言 实时的SQL监控&#xff08;Real Time SQL Monitoring&#xff09;是Oracle 11g的一个新特性&#xff0c;它是一项强大的工具&#xff0c;用于监视和分析正在执行的SQL语句的性能和执行计划。该功能允许我们实时地跟踪SQL查询的执行过程&#xff0c;以及了解其资源消耗、等…

Java的五种数据类型解析

Java的五种数据类型解析 不知道大家对java的简单数据类型是否了解&#xff0c;下面针对Java的五种类型简单数据类型表示数字和字符&#xff0c;进行详细的讲解和分析。 一、简单数据类型初始化 在Java语言中&#xff0c;简单数据类型作为类的成员变量声明时自动初始化为默认值…

Ext JS中定义和使用类Ext JS风格的html 按钮

Ext JS 的按钮样式如下: 按钮的背景色默认为应用的主色调或是灰色系, 也可以通过样式设置按钮的背景色, 详细可以参考: Ext JS 如何设置工具栏按钮和一般按钮保持统一样式 但是, 在实际开发的场景中有可能某些按钮是不能通过Ext JS的Button 类进行创建的, 但是页面效果…

如何快速入门「组织结构图」?

组织结构图&#xff0c;对于公司老板和HR可谓是家常便饭&#xff0c;公司发展好&#xff0c;组织结构要升级和调整&#xff0c;人员“正常”流动&#xff0c;都需要用到它。组织结构图可以让人快速的了解公司的行政结构和权利体系&#xff0c;也是让新员工或客户快速了解公司相…