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

引言:在学习了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.mfbz.cn/a/790767.html

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

相关文章

MySql性能调优01-[数据结构和索引]

数据结构和索引 什么是索引索引的种类常见索引数据结构和区别二叉树 红黑树 什么是索引 索引的种类 在Mysql中索引是在存储引擎层实现的&#xff0c;而不是在服务层实现的 按数据结构分&#xff1a;Btree索引、Hash索引、Full-text索引按存储结构分&#xff1a;聚簇索引、非聚…

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

一、功能实现 1.电脑通过串口发送数据&#xff1a;0F 2.点亮4个LED 二、注意事项 1.发送和接受数据的文本模式 2.串口要对应 3.注意串口的波特率要和程序中的波特率保持一致 4.有无校验位和停止位 三、如何使用串口波特率计算器 1.以本程序为例 2.生成代码如下 void Uar…

d3dcompiler_43.dll文件是什么?如何快速有效的解决d3dcompiler_43.dll文件丢失问题

dcompiler_43.dll 是一个Windows系统中的系统文件&#xff0c;属于DirectX软件的一部分。这个dcompiler_43.dll&#xff08;动态链接库&#xff09;文件主要用于处理与3D图形编程有关的任务&#xff0c;是运行许多游戏和高级图形程序必需的组件之一。那么如果电脑丢失d3dcompil…

Qt/QML学习-PathView

QML学习 PathView例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")color: "black"PathView {id: pathViewanchors.fill: parentmodel: ListModel {List…

scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别

一、在 Python 中&#xff0c;有多种函数可以用于应用 FIR/IIR 滤波器&#xff0c;每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别&#xff1a; from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…

轻松搭建RAG:澳鹏RAG开发工具

我们很高兴地宣布推出RAG开发工具&#xff0c;这是澳鹏大模型智能开发平台的一项新功能。此功能可帮助团队轻松创建高质量的检索增强生成 (RAG) 模型。 什么是 RAG&#xff1f; 检索增强生成 (RAG) 通过利用大量外部数据源&#xff08;例如企业的知识库&#xff09;显著增强了…

springboot篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

Python 爬虫与 Java 爬虫:相似之处、不同之处和选项

在信息时代&#xff0c;网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息&#xff0c;爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言&#xff0c;都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异&#xff0c;以帮助…

「媒体邀约」上海请媒体的费用

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 上海无疑是最具活动的城市之一&#xff0c;各种大大小小的论坛、发布会、展览展会应接不暇&#xff0c;那么在上海做活动想邀请媒体进行宣传报道&#xff0c;需要多少费用呢&#xff1a;…

C++ 【 PCL 】点云添加随机均匀噪声及源代码

PCL向点云添加均匀随机噪声&#xff1a; #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/random.h>int main() {// 加载点云文件pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::Poi…

深入剖析数据库索引

写在前面&#xff1a; 此博客内容已经同步到我的博客网站&#xff0c;如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/database 文章目录 如何验证我们正在使用InnoDB引擎 主键如果你没有自己创建任何主键会发生什么&#xff1f;关键字和索引之间的区别…

【HarmonyOS NEXT】鸿蒙 代码混淆

代码混淆简介 针对工程源码的混淆可以降低工程被破解攻击的风险&#xff0c;缩短代码的类与成员的名称&#xff0c;减小应用的大小。 DevEco Studio提供代码混淆的能力并默认开启&#xff0c;API 10及以上版本的Stage模型、编译模式为release时自动进行代码混淆。 使用约束 …

MD5加密和注册页面的编写

MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…

GBPC5010-ASEMI逆变箱专用GBPC5010

编辑&#xff1a;ll GBPC5010-ASEMI逆变箱专用GBPC5010 型号&#xff1a;GBPC5010 品牌&#xff1a;ASEMI 封装&#xff1a;GBPC-4 批号&#xff1a;2024 现货&#xff1a;50000 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;50A 功…

越南语是一门什么样的语言?如何学好越南语?

越南语是一种南亚语系越芒语族的语言&#xff0c;具有丰富的汉语借词&#xff0c;尤其在抽象概念的表达上&#xff0c;汉越词汇占有很大比例。作为一种声调语言&#xff0c;越南语拥有六个声调&#xff0c;这使得其发音具有音乐性和节奏感。它是一种孤立语&#xff0c;依赖于语…

Xshell配置ssh免密码登录(密钥登陆)

文章目录 一、Xshell登陆步骤 一、Xshell登陆步骤 1.生成客户端的公钥私钥 2.生成公钥文件 3.生成私钥文件 4.将公钥传输进要登录的服务器中 5.修改公钥文件名为authorized_keys (authorized_keys是用于存储公钥的特殊文件,如果已经有了这份文件,可以在末尾追加) 6.连…

芋道源码 yudao-cloud 文档,视频,开发指南如何看全部

进入官网后可以看到相关内容 但是后端手册开始就看不了了 必须加入知识知识星球才行&#xff0c;很烦 闲**鱼搜索用户 水城打坐的藤壶 找到这个链接 这下大家都懂了吧 现在就可以看到看不到的内容了 在线文档的弹窗可技术去除&#xff0c;很简单 直接起飞哈 包括更新sq…

LIO-SAM编译ubuntu20.04 Noetic

一、下载 mkdir -p ~/lio_sam_ws/src cd ~/lio_sam_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd ..二、编译&&解决报错 catkin_make报错如下 解决方案&#xff1a; 第一步&#xff1a; sudo add-apt-repository ppa:borglab/gtsam-release-4…

2.快速搭建 SpringBoot hello world

环境要求&#xff1a; Spring Boot 2.6.1 需要Java 8&#xff0c;并且与Java 15&#xff08;包括&#xff09;兼容。 还需要Spring Framework 5.2.10.RELEASE或 更高版本。 注意&#xff1a;Spring Boot 3.0版本以上就需要 Java 8以上了&#xff0c;即不能再使用 Java8版本了。…

数据存储方案选择:ES、HBase、Redis、MySQL与MongoDB的应用场景分析

一、概述 1.1 背景 在当今数据驱动的时代&#xff0c;选择合适的数据存储技术对于构建高效、可靠的信息系统至关重要。随着数据量的爆炸式增长和处理需求的多样化&#xff0c;市场上涌现出了各种数据存储解决方案&#xff0c;每种技术都有其独特的优势和适用场景。Elasticsear…