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

news2024/11/18 3:21:45

目录

前言

类与对象的引入

类的定义

类的访问限定符及封装

访问限定符:

封装:

类的作用域

类的实例化

类的大小

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

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

相关文章

Linux流量分析工具 | nethogs

在应急过程中&#xff0c;经常会遇到应用访问缓慢&#xff0c;网络阻塞的情况&#xff0c;分析原因可能会想到存在恶意程序把带宽占满的可能。通过这样一个小工具可以快速定位异常占用带宽程序的路径、PID、占用流量大小或是排除由带宽占满导致服务器缓慢的猜想。 一、简介 Ne…

GitHub Actions 手动触发方式

目录 前言 Star Webhook 手动触发按钮 前言 GitHub Actions 是 Microsoft 收购 GitHub 后推荐的一款 CI/​CD 工具早期可能是处于初级开发阶段&#xff0c;它的功能非常原生&#xff0c;甚至没有直接提供一个手动触发按钮一般的触发方式为代码变动&#xff08;push 、pull…

Linux网络-PXE高效批量网络装机(命令+截图详细版)

目录 一.部署PXE远程安装服务 1.PXE概述 1.1.PXE批量部署的优点 1.2.要搭建PXE网络体系的前提条件 2.搭建PXE远程安装服务器 2.1.修改相关网络配置&#xff08;仅主机模式&#xff09; 2.2.关闭防火墙&#xff08;老规矩&#xff09; 2.3.保证挂载上 2.4.准备好配置文…

如何使用IntelliJ IDEA SSH连接本地Linux服务器远程开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

【面经】网络

了解TCP/IP协议,了解常用的网络协议&#xff1a;study-area 一、TCP/IP协议 TCP/IP协议是一组网络通信协议&#xff0c;旨在实现不同计算机之间的信息传输。 1、TCP/IP四层模型&#xff1a; 网络接口层、网络层、传输层和应用层。 网络接口层&#xff1a;定义了数据的格式和…

C++ 基础 输入输出

一 C 的基本IO 系统中的预定义流对象cin和cout: 输入流&#xff1a;cin处理标准输入&#xff0c;即键盘输入&#xff1b; 输出流&#xff1a;cout处理标准输出&#xff0c;即屏幕输出&#xff1b; 流&#xff1a;从某种IO设备上读入或写出的字符系列 使用cin、cout这两个流对…

【springboot基础】如何搭建一个web项目?

正在学习springboot&#xff0c;还是小白&#xff0c;今天分享一下如何搭建一个简单的springboot的web项目&#xff0c;只要写一个类就能实现最基础的前后端交互&#xff0c;实现web版helloworld &#xff0c;哈哈&#xff0c;虽然十分简陋&#xff0c;但也希望对你理解web运作…

车载测试系列:车载蓝牙测试(三)

HFP测试内容与测试方法 2.3 接听来电&#xff1a;测试手机来电时&#xff0c;能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件&#xff1a;待测手机与车载车载设备处于连接状态 2、测试步骤&#xff1a; 1&#xff09;用辅助测试机拨打待测手机&…

【JavaWeb】Servlet+JSP+EL表达式+JSTL标签库+Filter过滤器+Listener监听器

需要提前准备了哪些技术&#xff0c;接下来的课才能听懂&#xff1f; JavaSE&#xff08;Java语言的标准版&#xff0c;Java提供的最基本的类库&#xff09; Java的开发环境搭建Java的基础语法Java的面向对象数组常用类异常集合多线程IO流反射机制注解Annotation… MySQL&…

CUDA流和事件

CUDA通过流来实现网格级并发。 流和事件 CUDA流是一系列异步的CUDA操作&#xff0c;这些操作按照主机代码确定的顺序在设备上执行。流可以封装这些操作&#xff0c;保持操作的顺序&#xff0c;允许操作在流中排队&#xff0c;并使他们在先前的所有操作之后执行。 这些操作包…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时&#xff0c;通过ip addr查看&#xff0c;也看不到IP信息 二、解决方案 找到ifcfg-ens0文件&#xff0c;此文件的目录在/etc/sysconfig/network-scripts目录下 命令&#xff1a;cd /etc/sysconfig/network…

Windows系统本地部署DrawDB数据库设计工具并实现无公网IP远程访问

文章目录 1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 开发中很多时候都会使用到数据库&#xff0c;所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代&#xff0c;数据库管理是许多企业和个人项目的核心。设…

buuctf-misc题目练习二

ningen 打开题目后是一张图片&#xff0c;放进winhex里面 发现PK&#xff0c;PK是压缩包ZIP 文件的文件头&#xff0c;下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离&#xff0c;或者识别当前的文件是什么文件。比如拓展名被删除、被附加…

Spring - 9 ( 10000 字 Spring 入门级教程 )

一&#xff1a; MyBatis XML 配置文件 Mybatis 的开发有两种方式&#xff1a; 注解XML 我们已经学习了注解的方式, 接下来我们学习 XML 的方式 MyBatis XML 的方式需要以下两步: 配置数据库连接字符串和 MyBatis写持久层代码 1.1 配置连接字符串和 MyBatis 此步骤需要进…

【经验分享】企业网站建设,不收录的原因有哪些

今天来聊一聊我们做好网站&#xff0c;但是网站排名不高&#xff0c;各大搜索引擎不收录网站的原因&#xff1a; 1.网站结构问题&#xff1a; 公司网站的结构是搜索引擎判断网站内容的关键因素之一。如果网站结构混乱、不清晰&#xff0c;搜索引擎可能难以准确抓取和理解网站的…

汇编--栈和寄存器

栈 栈是一种运算受限的线性表&#xff0c;其限定仅在表尾进行插入和删除操作的线性表&#xff0c;表尾也被叫做栈顶。简单概括就是我们对于元素的操作只能够在栈顶进行&#xff0c;也造就了其先进后出的结构特性。 栈 这种内存空间其实本质上有两种操作&#xff1a;将数据放入…

新款iPad Pro引领AI新纪元:M4芯片揭幕,每秒38万亿次运算惊艳业界

新款iPad Pro搭载了强大的M4芯片&#xff0c;拥有每秒高达38万亿次运算的神经处理单元&#xff0c;AI性能超越当今的AI PC。其外观设计更加接近笔记本电脑&#xff0c;展示了苹果对AI技术的全面拥抱。此次发布不仅是对iPad Pro的一次重大更新&#xff0c;更是为下个月的WWDC发布…

00后抛弃新氧、上游抗议低价,金星又被打脸了

作为“颜值焦虑”的受益者&#xff0c;新氧也面临自己的焦虑。 据新氧最近发布的年报&#xff0c;2023年营收14.98亿元&#xff0c;同比增长19.1%&#xff1b;净利2130万元&#xff0c;同比扭亏为盈。但是&#xff0c;这仅是源于2022年公司业绩的低基数对比&#xff0c;并不能…

Faiss核心解析:提升推荐系统的利器【AI写作免费】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

QT---day4事件

1、思维导图 2、 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include<QIcon> //图标类 #include<QLabel> //标签类 #include<QMovie> //动图类 #include<QLineEdit> //行编辑器类 #include<QPushButton> //按钮…