C++类和对象1

news2024/11/15 9:59:08

一.类的定义

1.1类的创建

类是C++中用户自己建立的类型。类似于C语言中的结构体。定义类的关键字为class。格式为:

class 类名
{
	成员函数
	成员变量
	……
};

class 类名称为类头,花括号中的称为类体。类的声明以花括号后的分号结束,分号不可省略。在一个类中,既可以有成员变量,即类的属性;也可以有成员函数,即类的行为。而C语言阶段学习的结构体则只有成员变量。

C++中,类中的成员变量为了与其他变量区分,其成员变量建议在名字前加上下划线。

下面定义一个学生类:

class student
{	
	void GetStudentinfor()
	{
		cout << _name << endl << _age << endl << _id << endl;
	}

	char _name[15];//姓名
	int _age;//年龄
	char _id[20];//学号
};

该类中的姓名、年龄、学号都是成员变量,而获取学生信息是成员函数,它的功能是打印学生信息。

1.2访问限定符

一个类会将一组数据和操作封装在一起,对外界是隐蔽的,在类外不能直接调用类中的成员。这虽然很安全,但是程序要怎么才能执行其中的操作呢?一般,我们只需要将数据隐藏起来,而将函数作为对外界的接口,实现各种操作。

C++提供了访问限定符:private(私有)、public(公有)、project(保护)。我们可以通过访问限定符对类中的成员进行修饰限定。当成员被private修饰时,表示该成员不能被类外直接访问,只能通过类的成员函数访问;当成员被public修饰时,表示该成员可以被类外直接访问;project也只能被成员函数访问,不能直接被类外访问。

当我们创建类时不指定访问限定符时,class会默认类中的成员全都为private。 

所以,有了访问限定符,我们定义类时就应该对成员进行修饰限定:

class 类名
{
public:
	成员函数

private:
	成员变量
};

通常,我们将成员变量定义为private,将成员函数定义为public。成员限定符可以在一个类体中多次出现,但是建议将具有同一属性的成员写在一块。

在定义类时,将类的成员函数写在前面,将类的成员变量写在后面。

下面我们对刚才的studen类进行修改:

class student
{
public:
	void GetStudentinfor()
	{
		cout << _name << endl << _age << endl << _id << endl;
	}

private:
	char _name[15];//姓名
	int _age;//年龄
	char _id[20];//学号
};

1.3类域

定义类时就形成了一个新的作用域,该作用域不会改变成员变量的生命周期,只是对成员变量加以限制。

一般我们类中的成员函数都是在类体中直接定义的,但是如果只是在类体中声明,在类外定义的话,需要借助作用域运算符来说明该成员函数或者成员变量是属于哪一个类的。否则该函数就是一个普通函数,可以被任何人调用,不可以访问类中的私有成员变量。

在类外定义成员函数的格式为:

返回值 类名::函数名()
{

}
class student
	{
	public:
		void GetStudentinfor();//声明
	
	private:
		char _name[15];//姓名
		int _age;//年龄
		char _id[20];//学号
	};

//定义
void student::GetStudentinfor()
{
	cout << _name << endl << _age << endl << _id << endl;
}

二.类的实例化

我们定义好了类,但是类只是我们定义的一个自定义类型而已,它就好比一个设计图纸,是没有大小的,当我们利用该图纸建造了房子,这就是一种实例化的体现。所以类的实例化其实就是用类建立对象的过程。

student s1;
student s2;

我们利用我们定义的类创建了两个对象s1和s2,这就是类的实例化。

2.1对象的大小

对象的大小是怎么计算的呢?我们用同一个类创建的不同对象除了成员变量不同外,其他的都是相同的。那么对象在内存中的存储是即存储变量也存储函数么?如果这样的话,同一份相同的代码要储存多少份呢?所有的对象调用成员函数时都是调用的同一份代码,这成员函数存储在内存中的某一个地方,但是并不在对象中。

所以对象的大小是不包括成员函数的,只包含成员变量。而其大小的计算方式与C语言中结构体大小的计算方式相同,采用内存对齐的方式存储。

内存对齐的规则

  • 第⼀个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
  • 注意:对⻬数=编译器默认的⼀个对⻬数与该成员⼤⼩的较⼩值。
  • VS中默认的对⻬数为8
  • 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。

 特别要注意的是,当一个类只有成员函数没有成员变量的时候,以该类创建的对象的大小不是0而是1.

 三.this指针

当我们用同一个类创建了两个对象a,b,而它们调用的是同一份函数代码,那么该函数怎么确定使用哪一个对象的成员变量呢?

在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

所以当我们调用studeng类中的GetStudentinfor时,看似没有传参数,起始将调用该函数的对象的地址传给了该函数:

s1.GetStudentinfor();
//s1.GetStudentinfor(&s1)

而在该函数内部:

void student::GetStudentinfor(student* this)
{
	cout << _name << endl << _age << endl << _id << endl;
	//cout << this::_name << endl << this::_age << endl << this::_id << endl;
}

而this指针是隐式调用的,我们不需要管,但是this指针也可以显式的调用。需要注意的是,我们在传参数的时候不必传对象的地址,是隐式传递的。但是我们可以在函数内部显式的使用this指针。

四.struct和class的区别

struct原本是C语言中定义结构体的关键字,但是在C++中,struct得到了升级,它可以定义类,但是struct定义的类默认成员函数和成员变量都是公有的(public),而class定义的类默认成员函数和成员变量是私有的(private)。


完~ 

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

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

相关文章

Go-Zero微服务框架下开发接口流程

目录 一&#xff1a;定义api入参和返回值 二&#xff1a;生成入参和返回值文件 三&#xff1a;定义rpc参数和返回值 四&#xff1a;生成返回值和参数 五&#xff1a;定义数据库 六&#xff1a;生成数据库文件 今天我们来讲解下如何在Go-Zero下开发一个api接口的具体流程&…

UCOSIII内存管理机制详解

目录 前言 1. 内存管理概述 2. 内存区域&#xff08;存储区&#xff09;和内存块 3. 存储区控制块&#xff08;OS_MEM&#xff09; 4. 内存管理函数 5. 内存碎片问题 6. 注意事项 7.代码实现 7.1创建内存区域 7.2申请内存 7.3释放内存 前言 UCOSIII&#xff08;即Mi…

算法的学习笔记—正则表达式匹配的动态规划算法解析

&#x1f600;前言 正则表达式是一种强大的工具&#xff0c;广泛应用于文本匹配和处理。在许多编程任务中&#xff0c;我们可能会遇到需要匹配字符串与某个特定模式的情况。本文将介绍如何使用动态规划算法实现一个支持 . 和 * 的正则表达式匹配功能&#xff0c;并以 Java 为例…

中科院TOP“灌水神刊”合集!年发文量动辄数千篇,TOP的地位,4区的录用率!

【SciencePub学术】本期&#xff0c;给大家推荐几本环境领域的“灌水神刊”&#xff01;均隶属于中科院TOP刊之列&#xff0c;但是每年庞大的发文量致使投稿接收率极高&#xff01;话不多说&#xff0c;想“灌水”的建议收藏&#xff01; 01 年刊文量4000 Journal of Cleaner …

【C++】---红黑树详解

【C】---红黑树详解 一、什么是红黑树&#xff1f;1、概念2、性质3、四个规则 二、红黑树的定义1、红黑树 结点 定义&#xff08;1&#xff09;将新插入的结点 设置为黑色&#xff08;2&#xff09;将新插入的结点 设置为红色 2、红黑树的定义 三、红黑树插入1、插入节点2、控制…

Zabbix自动导出PDF报告

zabbix6提供了定时导出PDF报告功能。此功能可按照Dashboard维度&#xff0c;定时自动导出报告&#xff0c;并通过邮件发送。 1.安装 zabbix 提供了官方的rhel8版本的rpm包&#xff0c;可使用yum方式安装&#xff0c;zabbix自动导出PDF功能是基于go环境的zabbix web service程…

应用方案 | 低功耗接地故障控制器D4145

一、概述 D4145 是一个接地故障断路器。它能够检测到不良的接地条件&#xff0c;譬如装置接触到水时&#xff0c;它会在有害或致命的电击发生之前将电路断开。 D4145能检测并保护从火线到地线,从零线到地线的故障.这种简单而传统的电路设计能够确保其应用自如和长时间的可靠性。…

Vue3+Echarts+Setup实现动态曲线堆叠图+图例分页

提前安装引入echarts 效果图 dom实例 <div id"rightCharterwang" style"height: 28vh"></div> 配置项&#xff0c;将数据换成从接口请求回来的数据&#xff08;这里是写死的假数据&#xff09; const rightCharterwang () > {let named…

vcruntime140_1.dll丢失是什样的错误?五种vcruntime140_1.dll修复方法详细步骤教程

对于经常使用Windows操作系统的用户来说&#xff0c;面对“vcruntime140_1.dll文件丢失”的错误提示可能既熟悉又令人苦恼。这个错误通常发生在尝试启动或安装一些依赖于此特定DLL文件的应用程序时&#xff0c;在本文中&#xff0c;我们将详细介绍 ​vcruntime140_1.dll​ 所承…

使用Python和Pillow创建照片马赛克应用

在这篇博客中,我们将探讨如何使用Python创建一个简单而有趣的桌面应用程序。我们的目标是构建一个应用,允许用户选择一张照片,然后在照片的右下角添加马赛克效果。这个项目将展示如何结合使用wxPython来创建图形用户界面(GUI)和Pillow库来处理图像。 D:\spiderdocs\eraselogo.p…

Linux 基本指令讲解 上

linux 基本指令 clear 清屏 Alt Enter 全屏/退出全屏 pwd 显示当前用户所处路径 cd 改变目录 cd /root/mikecd … 返回上级目录cd - 返回最近所处的路径cd ~ 直接返回当前用户自己的家目 roor 中&#xff1a;/root普通用户中&#xff1a;/home/mike mkdir 创建一个文件夹(d) …

通义灵码:AI 研发趋势与效果提升实践丨SDCon 全球软件技术大会演讲全文整理

作者&#xff1a;张昕东 大家好&#xff0c;我是来自阿里云通义灵码团队的张昕东。很高兴和各位同仁做这次分享&#xff0c;分享的主题是人机协同趋势与效果提升实践。我们所做的模型提升和功能开发是为了促进人机在研发领域的协同&#xff0c;而当今的人机协同现状又决定了我…

基于Spring Boot的农田智能管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 农田智能管理系统是基于SpringBoot框架开发的一款针对农田管理的智能化平台。随着农业现代化的发展&#xff0c;农田管理需要更…

docker拉取kafka镜像|启动kafka容器

1、kafka官网快速开始模块查看如何拉取kafka的docker镜像 https://kafka.apache.org/quickstart 2、移除本机已拉取kafka的docker镜像 docker rmi apache/kafka:3.7.03、拉取kafka的docker镜像 docker pull apache/kafka:3.7.04、启动kafka容器 docker run -p 9092:9092 ap…

iOS 18(macOS 15)Vision 中新增的任意图片智能评分功能试玩

概述 在 WWDC 24 中库克“大厨”除了为 iOS 18 等平台重磅新增了 Apple Intelligence 以外&#xff0c;苹果也利用愈发成熟的机器学习引擎扩展了诸多内置框架&#xff0c;其中就包括 Vision。 想用本机人工智能自动为我们心仪的图片打一个“观赏分”吗&#xff1f;“如意如意&…

【2.3】回溯算法-重新排序得到 2 的幂

一、题目 给定正整数N&#xff0c;我们按任何顺序&#xff08;包括原始顺序&#xff09;将 数字重新排序 &#xff0c;注意其前导数字不能为零。 如果我们可以通过上述方式得到2的幂&#xff0c;返回 true&#xff1b;否则&#xff0c;返回false。 提示&#xff1a; 1 < …

学习记录第二十六天

进程运行 1&#xff0c;子进程和父进程做相同的事----创建子进程 执行任务 2&#xff0c;子进程做与父进程不同的事 ----fork exec exec族 l VS v :主要是第二个参数的传参方式不同 p :表示寻找可执行文件 是通过PATA环境变量 e : 表示可以给…

升级软文发稿开源系统源码论文期刊一键发布

升级软文发稿运营管理源码—论文期刊一键发布 软文发稿系统源码&#xff08;软文发布系统&#xff09;在基于旧版本的媒介软文发布平台项目改造升级了新的功能模块简称&#xff08;3.0版&#xff09;本系统还是基于开源的PHPMYSQLlayui&#xff08;前端界面&#xff09;代码进行…

唐山网站建设方案优化

唐山作为一个重要的工业城市&#xff0c;网站建设在这里具有重要的意义。为了更好地服务于市民和企业&#xff0c;唐山网站建设方案需要不断优化和更新。下面将从内容、技术和设计三个方面来探讨唐山网站建设方案的优化。 首先是内容方面。唐山作为一个历史悠久且拥有丰富文化底…

如何提高遭受网络攻击后的恢复速度

现实促使组织探索提供更快恢复和增强安全性的替代网络保护和恢复方法&#xff0c;尤其是在更严格的法规驱动下&#xff0c;这种紧迫感愈加明显。以下是一些提高网络安全策略恢复速度的方法。 近年来&#xff0c;勒索软件攻击已成为一个重大且令人担忧的趋势&#xff0c;其频率和…