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指针,受限于本人的水平,可能文章中会存在一些问题,欢迎各位指正,同时对您能够耐心看完本文给予真挚的谢意。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨越智能建筑桥梁:西门子PLC无缝对接BACnet楼宇自动化系统化

智能楼宇每一个环节的互联互通都至关重要&#xff0c;而PLC&#xff08;可编程逻辑控制器&#xff09;作为自动化领域的基石&#xff0c;其与BACnet协议的融合无疑成为了构建智能楼宇神经系统的关键节点。今天&#xff0c;让我们深入探讨如何利用先进的PLC转BACnet协议网关&…

Windows平台PyCharm之PySide6开发环境搭建与配置

PySide6 是一个用于创建跨平台 GUI 应用程序的库&#xff0c;它是 Qt for Python 的官方库。Qt 是一个跨平台的 C 应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序。PySide6 允许开发者使用 Python 语言访问 Qt 的功能&#xff0c;从而…

从一毫秒到十秒:“最纯硅”激增相干时间,引领百万量子比特芯片革命

“量子计算的未来正在崭露头角”——至少专家们是这么认为的。 量子计算机并非使用传统计算中的常规1和0&#xff0c;而是利用量子物理学那些神奇的特性&#xff0c;以指数级速度执行某些计算任务。然而&#xff0c;制造一台实用的大型量子计算机面临着巨大的挑战&#xff0c;其…

Centos中将UTC的时区改为CTS时区

date命令可以看到现在的时间以及时区&#xff0c;可以看到现在是UTC时区 而想要更改时区那么就要了解tzselect命令 tzselect 是一个 Linux 命令行工具&#xff0c;用于交互式地帮助用户选择并设置系统的时区。这个程序会通过一系列的问题引导用户&#xff0c;从而确定用户所在的…

Linux命名管道的创建及应用

目录 一、命名管道的定义即功能 1.1创建命名管道 1.2匿名管道和命名管道的区别 1.3命名管道的打开规则 1.4系统调用unlink 二、进程间命名管道的创建及使用 2.1Comm.hhp 2.2PipeServer.cc 2.3PipeClient.cc 一、命名管道的定义即功能 管道应用的一个限制就是只能在具有…

动手学机器学习15 实战kaggle比赛

动手学机器学习15 实战kaggle比赛 1. 实战kaggle比赛&#xff1a;预测房价代码结果 2. 课程竞赛&#xff1a;加州2020年房价预测3. QA4. 用到的代码1. hashlib.sha1()2. sha1.update(data)3. train_data.iloc4. fillna(0)5. pd.get_dummies(&#xff09;6. nn.MSELoss()7. torc…

Linux网络部分——部署YUM仓库及NFS共享服务

目录 一、yum仓库服务 1. 软件仓库的提供方式 2.如何构建并使用ftp软件仓库&#xff08;与本地yum源方法一致&#xff09; 3.如何搭建使用yum在线源&#xff1f; 4.yum软件包下载如何保存&#xff1f; 二、NFS共享存储服务 1.存储类型 2.提供共享存储的组合 3.NFS网络…

带你快速了解并掌握TypeScript

TypeScript &#x1f4cc;TypeScript(简称:TS)是微软推出的开源语言 &#x1f4cc;TypeScript 是 JavaScript 的超集(JS 有的 TS 都有) &#x1f4cc;TypeScript Type JavaScript(在 JS 基础上增加了类型支持) &#x1f4cc;TypeScript 文件扩展名为 ts &#x1f4cc;TypeScri…

JMeter断言介绍

JMeter是一个功能强大的性能测试工具&#xff0c;它不仅可以模拟用户的行为&#xff0c;还可以对web应用程序的响应进行检测。其中断言就是JMeter中非常实用的功能之一。 断言是用于验证服务器响应是否正确的测试元素。它会检查服务器响应中的部分或全部内容&#xff0c;并在响…

[NSSRound#1 Basic]basic_check

[NSSRound#1 Basic]basic_check 开题什么都没有&#xff0c;常规信息搜集也无效 发现题目允许PUT的两种做法&#xff1a; 1、 CURL的OPTIONS请求方法查看允许的请求方式 curl -v -X OPTIONS http://node4.anna.nssctf.cn:28545/index.php2、 kali自带的nikto工具扫描网址 Nik…

vscode调试typescript(单文件)

环境 tsc: Version 5.4.5 ts-node: v10.9.2 node: v20.12.0 步骤 1.创建文件夹&#xff0c;下方创建一个index.ts。 function test() {let str: string Hello world.console.log(str) } test()2.安装ts调试插件。 3.点击VSCode的运行和调试Tab&#xff08;第三个&#xff…

el-dialog设置el-head固定

0 效果 1 代码 ::v-deep .adTextDetailDialogClass .el-dialog__body{max-height: calc(100vh - 150px);overflow: auto;border-top:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf; } ::v-deep .adTextDetailDialogClass .el-dialog{position: fixed;height:fit-content;…

Leetcode—155. 最小栈【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—155. 最小栈 实现代码 class MinStack { public:MinStack() {}void push(int val) {if(st.empty()) {st.emplace(val, val);} else {st.emplace(val, min(val, st.top().second));}}void pop() {if(st.empty()) {return;}…

接口数据脱敏实现方案

背景 敏感信息如手机号、身份证、邮箱等信息需要脱敏后展示给前台&#xff0c;如果需要查看&#xff0c;则需要申请权限&#xff0c;查询时需要记录操作日志。 方案 通过JsonSerializer和注解&#xff0c;在json序列化的时候做脱敏操作 此处使用redis存储了加密后的key和明…

查看pytorch与cuda对应版本

查看cuda版本 打开cmd,输入nvidia-smi&#xff0c;即可可以看到cuda的版本了 2. pytorch与cuda版本对应关系 可以参考这篇文章&#xff0c;写的非常详细&#xff1a;https://blog.csdn.net/FL1768317420/article/details/134769203

预测市场?预测股票?如何让预测有更高的准确率?

我们发现在足球赛中&#xff0c;只要知道一个简单的讯息&#xff08;主队过去的获胜机率超过一半&#xff09;&#xff0c;预测力就会明显好过随便乱猜。如果再加上第二个简单的讯息&#xff08;胜负纪录较佳的队伍会略占优势&#xff09;&#xff0c;可以再进一步提升预测力。…

遇事不决,阿尔萨斯(Arthas)

文章目录 一、cat log.log | grep 流水号 引发的惨案二、Collections.sort排序long型强转int型引发的惨案 一、cat log.log | grep 流水号 引发的惨案 接口报错&#xff0c;查看日志是空指针&#xff0c;但是没有详细的报错信息。 以为是日志打印格式的问题&#xff0c;遂改变…

2024年软件测试最新Web安全测试(文末送电子书)_电子书下载 安全测试,腾讯软件测试开发面试经验

网上学习资料一大堆&#xff0c;但如果学到的知识不成体系&#xff0c;遇到问题时只是浅尝辄止&#xff0c;不再深入研究&#xff0c;那么很难做到真正的技术提升。 需要这份系统化的资料的朋友&#xff0c;可以戳这里获取 一个人可以走的很快&#xff0c;但一群人才能走的更…

Spring AI实战之一:快速体验(OpenAI)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于Spring AI Spring Boot、Spring Cloud、Spring Data&#xff0c;作为一名Java程序员&#xff0c;相信您对这些概览早已耳熟能详&#xff0c;或者天天在用…

本地搭建springboot服务并实现公网远程调试本地接口

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…