C++从入门到入土(二)——初步认识类与对象

目录

前言

类与对象的引入

类的定义

类的访问限定符及封装

访问限定符:

封装:

类的作用域

类的实例化

类的大小

this指针

this指针的特性


前言

各位佬们,在开始本篇文章的内容之前,我想先向大家道个歉,由于最近学习任务繁重,因此博客更新比较缓慢(实际上是因为我比较懒,哈哈哈)。在上一篇博客,我简单介绍了C++的一些基础知识,而这些基础知识则是为本篇博客打基础的,今天这篇博客则是开始介绍C++的关键部分,类与对象。如果我的博客对您有所帮助的话,希望能够点赞关注加转发,您的支持就是对我创作的最大鼓励。

类与对象的引入

首先我们要明白一点,C++这门语言实际上是在弥补C语言的各种缺陷中逐渐创造出来的一门新的编程语言,因此类与对象这个概念同样是为了弥补C语言在使用上的一些缺陷而引出来的,那么是什么样的缺陷导致要引入这一概念呢?在探讨这个问题之前我想先回顾一下C语言结构体的相关概念,比如我们要描述一个人的信息,我们可以创建一个结构体,里面包含了诸如:姓名、年龄、升高、体重等信息,当我们定义出这些信息后,C语言是通过各种不同的函数去实现这些不同的功能,因此可以这样说:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。通过这样的方式写出来的程序可能会导致这样的问题:比如在一个大型项目中,函数的实现与我们所定义的变量距离太远,那么对于阅读代码的人来说就会很麻烦,代码的可读性就会降低。为了解决这个问题C++提供了一个新的解决方法,就是将变量与函数定义在一起, 以顺序表为例:

typedef int SLDataType;
struct SeqList
{
public:void SeqListInit(struct SeqList*ps){ps->arr = nullptr;ps->capacity = ps->size = 0;}void CheckCapacity(struct SeqList* ps){if (capacity == size){int newcapacity = capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(arr, sizeof(SLDataType) * newcapacity);if (tmp == nullptr){perror("realloc fail");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}}
private:SLDataType* arr;int capacity;int size;
};

C++中用class代替struct。 

类的定义

class+类名+类域。类体中的内容称为类的成员,类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。

类的定义有两种方式,第一种方式是将声明和定义全放在类中;第二种方式是将类的声明放在.h文件中,成员函数定义放在.cpp文件中,一般情况下更采用第二种方式。

类的访问限定符及封装

访问限定符:

观察上述代码,我们可以发现,代码中加入了public和private操作符,这些操作符我们把它叫做访问限定操作符。

C++实现封装的方式是用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。那么为什么要引入访问限定符呢?实际上是为了让代码可读性增加,同时提高代码的安全性。下面我将向大家介绍访问限定操作符的使用说明。

访问限定操作符分为三种:public(公有)、protected(保护)、private(私有)

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

2.protect和private修饰的成员在类外不能被直接访问

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

4.如果没有访问限定操作符,作用域到}结束

5.class默认访问权限为privatee,struct默认为public(注:因为C++兼容C)

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

说了这么多,C++中的struct和class的区别是什么呢?

C++兼容C语言,所以C++中的struct可以当成结构体使用,同时C++中的struct也可以用来定义类,和class定义是一样的,区别在于struct定义默认访问权限是public,class定义的类默认访问权限是private。

封装:

C++面向对象有三大特性:封装、继承、多态。在类和对象阶段,我们先来介绍封装。

什么是封装呢?将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。仅仅通过定义来理解显得很晦涩,下面我来举个例子:

封装本质是一种管理,让用户更方便使用类,拿电脑举例,对于电脑这个复杂的设备,机箱里面放了很多东西,如果没有机箱,我们把主板、显卡、电源等全裸露在外面,这样就显得很乱,但是正是因为有了机箱,我们可以把这些东西全放在机箱里面,只提供给用户开机键,显示屏,键盘、鼠标等,这样就很容易实现人机交互,C++也是如此,通过将定义和函数封装在类里面,通过类将数据和操作数据的方法进行有机结合,通过访问权限来隐藏对象内部的实现细节,控制哪些方法可以在类外面直接被使用。

类的作用域

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

类的实例化

用类类型创建对象的过程称为类的实例化。我们在定义类的成员变量时只是做了声明,当我们使用类的成员变量时才会在内存中开辟空间,这个过程就叫类的实例化,即:一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

类的大小

当我们定义出类后,我们该如何计算类对象的大小呢?对象的占用大小只考虑成员变量。对于一个空类来说默认大小为一个字节,对于有函数定义无成员变量的类,默认也是一个字节。对于存在多个成员变量的类而言,遵循结构体内存对齐规则。

结构体内存对齐规则:

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

2.其他成员变量要齐到对齐数的整数倍的地址处

对齐数=编译器默认对齐数与该成员大小的较小值(vs中默认对齐数为8)

4.如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍

this指针

在介绍this指针之前,我想先来定义一个日期类:

class Data
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Data d1, d2;d1.Init(2024, 5, 9);d2.Init(2024, 5, 10);d1.Print();d2.Print();return 0;
}

运行结果如下:

观察上述代码,我们发现了一个问题,对于类中定义的两个函数,函数体中没有关于不同对象的区分,那么当d1调用Init函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

事实上,C++中通过引入this指针解决该问题,即:C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象,在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有操作对于用户是透明的,即用户不需要显示写,编译器自动完成。

this指针的特性

1.实参和形参的位置不能显示写,编译器自己加,但可以在类里面使用

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

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

总结

本篇本章主要简单介绍了C++中类和对象的定义以及类的一些特性,同时也简单介绍了一下this指针,受限于本人的水平,可能文章中会存在一些问题,欢迎各位指正,同时对您能够耐心看完本文给予真挚的谢意。

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

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

相关文章

Unity数据持久化之XML

目录 数据持久化XML概述XML文件格式XML基本语法XML属性 C#读取存储XMLXML文件存放位置C#读取XML文件C#存储XML文件 实践小项目必备知识点XML序列化&#xff08;不支持字典&#xff09;XML反序列化IXmlSerializable接口让Dictionary支持序列化反序列化 数据持久化XML概述 什么是…

Unity数据持久化之Json

目录 Json概述Json文件格式Json配置规则Excel转Json C#读取存储Json文件JsonUtlityJsonUtlity序列化JsonUtility反序列化 LitJsonLitJson序列化LitJson反序列化JsonUtility和LitJson对比 Json概述 Json是什么? 全称:JavaScript对象简谱(JavaScript Object Notation) Json是国…

修改表空间的状态

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 表空间有4种状态:联机、脱机、只读和读写。修改其中某一种状态的语句如下所示 设置表空间 tspace 为联机状态。 SQL>ALTER TABLESPACE space ONLINE: 设置表空间 tspa…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

C语言数据在内存中的存储

C语言数据在内存中的存储 个人主页&#xff1a;大白的编程日记 个人专栏&#xff1a;C语言学习之路 文章目录 C语言数据在内存中的存储前言一.整数在内存中的存储1.1整数的表示形式1.2整数在内存中的存放 二.大小端字节序和字节序判断2.1大小端的概念2.2为什么有大小端 三.练习…

利用智能私信软件,快速拓展潜在客户群体

在数字化营销的浪潮中&#xff0c;企业如何快速而有效地触及并吸引潜在客户&#xff0c;已成为一个不可忽视的挑战。随着人工智能技术的不断进步&#xff0c;智能私信软件作为一种新型工具&#xff0c;正逐渐改变着企业的市场拓展方式。本文将探讨如何通过这类软件&#xff0c;…

加州大学欧文分校英语中级语法专项课程04:Intermediate Grammar Project学习笔记(完结)

Intermediate Grammar Project Course Certificate Specialization Certificate Specialization Intro Course Intro 本文是学习 Coursera: Intermediate Grammar Project 这门课的学习笔记。 文章目录 Intermediate Grammar ProjectWeek 01: IntroductionCapstone Introducti…

机器学习——2.损失函数loss

基本概念 损失函数也叫代价函数。损失函数就是计算预测结果和实际结果差距的函数&#xff0c;机器学习的过程就是试图将损失函数的值降到最小。 图左&#xff1a;&#xff5c;t_p - t_c&#xff5c; 图右&#xff1a;&#xff08;t_p - t_c&#xff09;**2 代码实…

docker安装Debian:11 freeswitch1.10.5

文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步&#xff1a;安装freeswitch-mod和下载所需的依赖项3.2 设置密钥3.3 安装freeswitch所需的依赖项3.4 报错3.4.1 报错13.4.2 报错23.4.3 报错3 四、运行4.1 通话三十秒自动挂断 一…

linux学习:线程池

目录 原理 初始线程池 运行中的线程池 相关结构体 api 线程池初始化 投送任务 增加活跃线程 删除活跃线程 销毁线程池 例子 thread_pool.h thread_pool.c test.c 测试程序 原理 一个进程中的线程就好比是一家公司里的员工&#xff0c;员工的数目应该根据公司的…

【qt】容器的用法

容器目录 一.QVertor1.应用场景2.增加数据3.删除数据4.修改数据5.查询数据6.是否包含7.数据个数8.交换数据9.移动数据10.嵌套使用 二.QList1.应用场景2.QStringList 三.QLinkedList1.应用场景2.特殊点3.用迭代器来变量 四.QStack1.应用场景2.基本用法 五.QQueue1.应用场景2.基本…

LeetCode例题讲解:快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

[uniapp 地图组件] 小坑:translateMarker的回调函数,会调用2次

大概率是因为旋转和移动是两个动画&#xff0c;动画结束后都会分别调用此函数 即使你配置了 【不旋转】它还是会调用两次&#xff0c; 所以此处应该是官方的bug

JavaWeb之Servlet(上)

前言 1. 什么是Servlet (1) Servlet介绍 (2) Servlet运行于支持Java的应用服务器中。 (3) Servlet工作模式&#xff1a; 2. Servlet API 3. 第一个Servlet (1) 创建一个类实现Servlet接口,重写方法。或继承HttpServlet亦可 (2) 在web.xml文档中配置映射关系 标签的执行…

新能源汽车充电站智慧充电电能服务综合解决方案

安科瑞薛瑶瑶18701709087/17343930412 ★解决方案 ✔目的地充电-EMS微电网平台 基于EMS解决方案从设备运维的角度解决本地充电的能量管理及运维问题&#xff0c;与充电管理平台打通数据&#xff0c;为企业微电网提供源、网、荷、储、充一体化解决方案。 ✔运营场站--电能服务…

Burp插件之BurpSuitFake

在最近的测试中发现一个问题 某些高校在在登陆教务平台登陆的时候没有设置验证码 而且重点是 他写的很清楚 密码是身份证后六位 以下是我的一些思路和过程中解决的办法 part1信息搜集 学生的学号是很有规律的 例如我的学号 就是入学年份专业代码班级学号 每个大学学号规则不…

AlphaFold3: Google DeepMind的的新突破

AlphaFold 3的论文今天在Nature期刊发表啦!这可是AI在生物领域最厉害的突破的最新版本。AlphaFold-3的新招就是用扩散模型去"画出"分子的结构。它一开始先从一团模模糊糊的原子云下手,然后慢慢透过去噪把分子变得越来越清楚。 Alphafold3 我们活在一个从Llama和Sora那…

69、oak和华为atlas 200dk A2进行编解码测试

基本思想:将oak深度相机与atlas 200dk A2进行结合,测试其dvpp的编解码能力 cmakelist.txt cmake_minimum_required(VERSION 3.16) project(untitled10) set(CMAKE_CXX_FLAGS "-std=c++11") set(CMAKE_CXX_STANDARD 11) add_definitions(-DENABLE_DVPP_INTERFACE)i…

小红书释放被封手机号 无限注册

前几年抖音也可以释放被封手机号 那时候都不重视 导致现在被封手机号想释放 基本不可能的 或者就是最少几百块 有专业的人帮你通过某些信息差释放 本教程是拆解 小红书被封手机号怎么释放&#xff0c;从今年开始&#xff0c;被封的手机号无法注销了 所以很困扰 那么本教程来…

【ytb数据采集器】按关键词批量爬取视频数据,界面软件更适合文科生!

一、背景介绍 1.1 爬取目标 用Python独立开发的爬虫工具&#xff0c;作用是&#xff1a;通过搜索关键词采集油管的搜索结果&#xff0c;包含14个关键字段&#xff1a;关键词,页码,视频标题,视频id,视频链接,发布时间,视频时长,频道名称,频道id,频道链接,播放数,点赞数,评论数…