从零开学C++:类和对象(上)

news2024/9/22 10:03:31

引言:在学习了C++的入门级知识之后,现在就让我们一起进入类和对象的学习吧,该知识点我将分为上,中,下三个部分对其进行讲解。

更多有关C语言数据结构的知识详解可前往个人主页:计信猫

目录

一,类的引入

二,类的定义

1,类定义的格式

2,类定义的两种方式

三,类的访问

四,类大小的计算

五,this指针


一,类的引入

        在C语言当中,我们定义一个结构体的时候,里边的成员只可以为变量,不可以为函数,但是在C++中,我们会发现在结构体struct当中,我们还可以定义函数。就比如以数据结构初阶知识——栈为例子:

struct Stack
{
	//定义成员函数
	void StackInit(Stack* st)
	{
		st->_a = NULL;
		st->_capacity = st->_top = 0;
	}
	int* _a;
	int _top;
	int _capacity;
};

        而在C++中,我们更习惯使用的类定义关键字class。 

二,类的定义

1,类定义的格式

        当我们想要定义一个时,我们就可以使用关键字class来对类进行定义,而格式其实也跟C语言中的struct十分相似,如下:

class classname//classname表示类的名称
{
	//成员变量,成员函数
};

2,类定义的两种方式

        在定义成员函数时,第一种方法,我们可以成员函数的声明和定义都放在里边,如下所示:

class Person
{
	//将成员函数的声明和定义放在一起
	void PersonInfo(Person* p)
	{
		cout << p->_name << ' ' << p->_age << ' ' << p->_number << endl;
	}
	char* _name;
	int _age;
	int _number;
};

        第二种方式在工作当中就会被经常使用到,当函数的声明和定义分别在.h.cpp为后缀的两个文件当中时,我们就需要用到之前所学到的域作用限定符“::”了。

//.h文件当中存放函数的声明
class Person
{
	//将成员函数的声明和定义放在一起
	void PersonInfo(Person* p);
	char* _name;
	int _age;
	int _number;
};
//.cpp文件当中存放函数的定义
void Person::PersonInfo(Person* p)
{
	cout << p->_name << ' ' << p->_age << ' ' << p->_number << endl;
}

三,类的访问

         在的成员中,其实它们被分为了三类:public,private,protectedpublic修饰的成员在类之外也可以被访问privateprotected修饰的成员在之外就不能被访问了。它们的限定区域为从该访问限定符开始到下一个访问限定符或者“}”结束。其中class定义的类默认都为privatestruct定义的类默认都为public

        那么我们就可以定义一个的来进行举例说明:

class Date
{
public:
	//可以在类之外被访问
	void showdate()
	{
		//函数定义
	}
private:
	//只可以在类之内被访问
	int _year;
	int _month;
	int _date;
};

四,类大小的计算

        首先我们需要明白一个知识点,那就是在我们将一个类实例化,也就是创建了一个类的对象的时候,中的不同的成员类型都会在内存当中开辟不同的空间,而成员函数并不会开辟空间,它只会存在于一个内存当中公共位置并不是说创建多少个对象,就开辟多少份空间用于储存成员函数。 

        那当我们想要计算一个的字节大小的时候,其实非常简单,因为类的大小的计算也同样遵循我们之前所学到的结构体内存对齐的知识点。如果现在还不清楚或者有遗忘的话,给你一个传送门:结构体内存对齐,赶快去学习吧!!

        在这里我们粗略地讲一下结构体内存对齐存在的原因:在机器读取数据时,都是整数倍的位置开始读,并且读的字节个数固定(与机器有关),若不进行结构体内存对齐,就有可能导致一次取数据取到不同的变量类型

        而当没有成员变量或者只有成员函数的时候,此时的大小就为一个字节(纯粹是为了表示这个类的存在,一个占位标识而已)。

五,this指针

        this指针其实是C++里边的一个隐含关键字,我们可以举出如下例子来讲解:

class Date
{	
public:
	void Print()
	{
		cout << _year << ' ' << _month << ' ' << _date << endl;
	}
	int _year;
	int _month;
	int _date;
};
int main()
{
	Date d1;
	d1.Print();
}

        当我们定义一个名为Date,并且在main函数中调用里边的成员函数时,在程序运行时其实整个代码就会变成下面这样:

class Date
{	
public:
	void Print(Date* const this)
	{
		cout << this->_year << ' ' << this->_month << ' ' << this->_date << endl;
	}
	int _year;
	int _month;
	int _date;
};
int main()
{
	Date d1;
	d1.Print(&d1);
}

        怎么样,看到this指针的身影了吗?所以说,this指针其实就是一个表示类的对象的地址的指针,它一般会由编译器自己写上,当然,也可以被我们写在函数定义里边,但是声明上不能写。 

        那让我们看一个题目,加深我们对前边知识的理解:

class Date
{	
public:
	void Print()
	{
		cout << Print() << endl;
	}
	int _year;
	int _month;
	int _date;
};
int main()
{
	Date* p = nullptr;
	p->Print();
}

        那么这段代码在运行的时候会发生错误吗?答案是不会,因为此时this指针的值就是p,也就是nullptr,而Print()函数存在于一个公共区域,不需要对其进行解引用操作,那么代码就会正常运行。

        可一旦我们使用p指针进行访问成员类型的操作的时候,那么代码就会产生错误,因为此时我们就涉及到了对空指针nullptr解引用了。 

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

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

相关文章

【RHCE】NFS 实验

主服务器 下载nfs-utils软件包&#xff1a; 1.如果停⽌该服务&#xff0c;启动并启⽤该服务&#xff1a; systemctl enable - now rpcbind 2.要启动 NFS 服务器&#xff0c;并使其在引导时⾃动启动&#xff1a;systemctl enable - now nfs- server 3.配置防火墙&#xff0c;开…

RAG应用的典型工作流程

下面是RAG应用的典型工作流程&#xff1a; 具体步骤如下&#xff1a; 输入&#xff1a; 是指LLM系统需要回答的问题。如果不使用RAG&#xff0c;问题直接由LLM回答。 索引&#xff1a; 使用RAG时&#xff0c;会先将相关文档分块&#xff0c;为这些块生成嵌入向量&#xff0c;并…

prometheus回顾(2)--如何使用Grafana对接Prometheus数据源的详细过程,清晰易懂。

文章目录 Grafana简介什么是GrafanaGrafana 能做什么&#xff1f;什么时候我们会用到Grafana?Prometheus有图形化展示&#xff0c;为什么我们还要用Grafana? 环境操作步骤一、Grafana安装二、Grafana数据源Prometheus添加三、Grafana添加数据仪表盘补充、如何查找仪表盘 Graf…

力扣题解(设计跳表)

1206.设计跳表 已解答 不使用任何库函数&#xff0c;设计一个 跳表 。 跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树&#xff0c;其功能与性能相当&#xff0c;并且跳表的代码长度相较下更短&#xff0c;其设计思想与链表相似。 …

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

汉初三杰韩信,是不是颍川人

再重复一次&#xff0c;此韩信非彼韩信&#xff0c;说的是汉初三杰淮阴侯韩信&#xff0c;不是韩王信。 他俩的共同之处还真多&#xff0c;同名同姓&#xff0c;都被封王&#xff0c;八大异姓王韩姓占了两位。而且&#xff0c;结局也一样&#xff0c;都因反判罪被朝廷处死。这…

图书馆、档案馆、博物馆之智能建筑设计要求比较

关注我们 - 数字罗塞塔计划 - 随着科技的不断进步以及人们对建筑功能需求的日益提升&#xff0c;智能化技术在建筑领域的应用越来越广泛。将建筑物的结构、系统、服务和管理根据用户的需求进行最优化组合&#xff0c;进而为用户提供一个高效、舒适、便利的人性化建筑环境&…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 &#xff08;1&#xff09;准备Arcmap桌面软件&#xff1b; &#xff08;2&#xff09;准备2020年逐月平均气温数据&#xff08;NC格式&#xff09;、范围图层数据&…

[论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天带来又一篇RAG论文笔记&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 检索增强语言模型能够更好地适应世界状态的变化并融入长尾知识。然而&#xff0c;大多数现有方法只能从检索语料库中检索到短的连续文本片段&#xff0…

再见微软Excel, AI Excel带你轻松搞定复杂数据分析

大家好&#xff0c;我是YUAN哥。在数据处理的世界里&#xff0c;Microsoft Excel一直是我们的好帮手。不过&#xff0c;现在有一种更聪明、更简便的方式来管理和分析数据——那就是将AI引入电子表格。今天&#xff0c;我要向大家介绍一个神奇的新工具——Numerous.ai。 首先&am…

SepViT: Separable(分离式) Vision Transformer

Vision Transformers(ViT)在一系列的视觉任务中取得了显著的成功。然而,这些Transformer模型通常依赖大量的计算成本来实现高性能,这使得在资源受限的设备上部署它们变得非常困难。研究者们从深度可分离卷积(depthwise separable convolution)中汲取经验,并模仿其设计理…

【Python专栏】Python的历史及背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Python专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Python的背景介绍 关键词&#xff1a;Python、优缺点、领域 目录 …

先进电机拓扑及控制算法介绍(1)——串联绕组电机拓扑极其控制

1.前言 在这个专栏&#xff0c;我会介绍一些比较先进的电机拓扑及控制算法&#xff0c;并且会做仿真来验证这些电机拓扑及控制算法的先进性。什么叫做“比较先进的电机拓扑及控制算法”呢&#xff1f; 在我看来&#xff0c;这些电机拓扑及控制算法被提出不久&#xff0c;知道…

无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。【解决办法】

问题描述 新建好一台windows虚拟机&#xff0c;两台设备网络是互通的&#xff0c;但是物理机在访问虚拟机的网络共享文件资源时&#xff0c;出现图下所示的报错&#xff1a;XXX无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。用户…

初次用bable遍历vue项目下的中文

利用 babel 找到 AST 中的中文 // vite-plugin-babel-transform.js const parser require(babel/parser) const traverse require(babel/traverse).default // const types require(babel/types) // const generate require(babel/generator).default const fs require(f…

场外期权有交割日吗?场外期权应该怎么交割?

今天带你了解场外期权有交割日吗&#xff1f;场外期权应该怎么交割&#xff1f;场外个股期权是一种非标准化的金融衍生品&#xff0c;它允许投资者在未来某一特定日期以特定价格买入或卖出某一特定股票。 交割日就是买卖双方进行交割的日期,期权合约具有到期日,到期日的后一天…

开放式耳机哪种好用又实用?五大热门畅销空气炸锅推荐2024

开放式耳机市场现在越来越多品牌涌现了&#xff0c;作为数码博主&#xff0c;这里有必要给大家科普一下如何选择一款开放式欸日记是最好的&#xff0c;这篇文章就是给大家答疑解惑的&#xff0c;想要知道如何挑选一款开放式耳机的&#xff0c;看这一篇就够了&#xff0c;在介绍…

视频监控汇聚平台LntonCVS视频监控系统解决智慧产业园的安全应用方案

近年来&#xff0c;随着全国各地数字化转型和相关政策的出台&#xff0c;数字化和智慧化在各行业迅速发展&#xff0c;尤其是作为产业集群重要组成部分的产业园区。然而&#xff0c;园区智慧化进程加快的同时&#xff0c;数字化转型面临着诸如视频监控数据分散、联通不畅、碎片…

开源无人机从入门到炸机,共需要几步?

阿木实验室2024年的重磅新品 Prometheus 仿真笔记本已经上架有一段时间了&#xff0c;近日&#xff0c;该产品的研发负责人廖工受邀到直播间与开发者们深度解读了Prometheus仿真笔记本的设计理念。直播过程中&#xff0c;廖工不仅展示了该产品的功能demo&#xff0c;解答技术开…