【C++】--类与对象(1)

🧇个人主页: 起名字真南
🌭个人专栏:【数据结构初阶】 【C语言】 【C++】
请添加图片描述

目录

  • 1 类的定义
    • 1.1 类定义格式
      • 1.1.1 Stack类
      • 1.1.2 Date类
      • 1.1.3 Struct格式
    • 1.2 访问限定符
    • 1.3 类域
  • 2 实例化
    • 2.2 对象大小
  • 3 this指针

1 类的定义

1.1 类定义格式

1 class为定义类的关键字,Stack为类的名字,{}内为类的主体,并且类在定义的时候不能省略后面的分号,类体中的内容称为类的成员,类中的变量叫做类的属性,也被称为成员变量,类中的函数叫做类的方法也被称为成员函数
2 为了区分成员变量和全局变量以及主函数之间的变量在类中定义成员变量的时候可以加上下划线 ‘ _ ’
3 C++中struct也可以定义类,并且C++兼容C语言中struct结构体的用法,并且升级为类,最大的区别便是可以在内部定义函数。
4 定义在类中的成员函数默认为inline

1.1.1 Stack类

#include<iostream>
using namespace std;
#include<assert.h>

class Stack
{
public:
	//成员函数
	void Init(int n )
	{
		arr = (int*)malloc(sizeof(int) * n);
		if (arr == nullptr)
		{
			perror("开辟空间出现错误!");
			return;
		}
		capacity = n;
		top = 0;
	}

	void Push(int x)
	{
		arr[top++] = x;
	}

	int Top()
	{
		assert(arr);
		return arr[top - 1];
	}

	void Destroy()
	{
		free(arr);
		capacity = 0;
		top = 0;
	}

private:
	int* arr;
	size_t capacity;
	size_t top;
};

int main()
{
	Stack st1;
	st1.Init(4);
	st1.Push(1);
	st1.Push(2);
	st1.Push(3);
	st1.Push(4);
	cout << st1.Top() << endl;
	return 0;
}

1.1.2 Date类

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	//区分成员变量一般在名字前面加上下划线
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(2024, 9, 20);

	return 0;
}

在这里插入图片描述

1.1.3 Struct格式

#include<iostream>
using namespace std;
#include<assert.h>

//C语言环境下struct的定义
typedef struct ListNodeC
{
	ST* next;
	// struct ListNode* next;
	int val;
}ST;

struct ListNodeCpp
{
	void Init(int x)
	{
		next = nullptr;
		val = 0;
	}
	ListNodeCpp* next;
	int val;
};

在C++中不需要typedef只需要ListNodeCpp就可以代表这个类型,并且在struct类下里面的成员函数和成员变量默认的访问权限都是public。

1.2 访问限定符

  • C++实现封装的一种方式,就是用类把成员变量和成员函数结合在一块,然后通过访问权限选择性的将接口提供给外部的用户进行使用
  • public修饰的成员变量和函数是可以被任意访问的但是用private/protected修饰的则不能直接进行访问
  • class类在默认的情况下都是用private来修饰,struct在默认的情况下都是public
  • 访问限定符的权限以及作用范围都是从第一个访问限定符开始到第二个访问限定符之前,或者直接到 “ } ”。

1.3 类域

  • 类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员变量的时候需要使用 “::” 作用域操作符来指定该成员属于那个类域
  • 类域影响的是编译的查找规则,例如在下面的代码中如果在定义函数Init的时候没有指定类域就会出现访问不到Stack类中数据的错误,如果不指定类域那么Init就会被编译器认为是全局函数找不到类中的成员变量。
#include<iostream>
using namespace std;

class Stack
{
public:
	void Init(int n = 4);


private:
	int* array;
	size_t capacity;
	size_t top;
};
//声明和定义分离要指定类域
void Stack::Init(int n)
{
	array = (int*)malloc(sizeof(int) * n);
	if (array == nullptr)
	{
		perror("malloc fail");
		return;
	}
	capacity = n;
	top = 0;
}
int main()
{
	Stack st;
	st.Init();
	return 0;
}

在这里插入图片描述

2 实例化

  • 用类类型在物理内存中创建对象的过程叫做实例化对象。
  • 在类中的成员变量只是声明,并没有分配出空间,通过类进行实例化的对象才会分配空间
  • 一个类可以实例化出多个对象,实例化出来的对象占用实际的物理内存空间,存储成员变量。
class Date
{
public:
	void Init(size_t year = 2024, size_t month = 10, size_t day = 5)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	//只有声明,并没有分配空间
	size_t _year;
	size_t _month;
	size_t _day;
};
int main()
{
	//实例化出两个对象 d1 d2 
	Date d1;
	d1.Init();
	d1.print();
	Date d2;
	d2.Init(1000,10,10);
	d2.print();
	return 0;
}

2.2 对象大小

内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处
  2. 其他成员变量要对齐到对齐数的整数倍的地址处
  3. 对齐数 = 编译器默认的对齐数和成员变量大小的较小值
  4. vs中默认对齐数的大小是8
  5. 结构体的总大小为:最大对齐数(所有变量类型最大者与默认对齐数取最小)的整数倍
  6. 如果嵌套了结构体的情况下,嵌套的结构体对齐到自己最大对齐数的整数倍,整个结构体的大小就是所有最大对齐数的整数倍.
class A
{
public:
	void Init()
	{

	}
private:
	char _ch;
	int _i;
};
class B
{
public:
	void Init()
	{

	}

};
class C
{

};
int main()
{
	A a;
	B b;
	C c;
	cout << sizeof(a) << endl;
	cout << sizeof(b) << endl;
	cout << sizeof(c) << endl;
	return 0;
}

将上面的代码运行结果展示
在这里插入图片描述

我们可以看到输出的结果是 8 1 1,说明a b c 的大小分别是 8 1 1,那么这个结果是怎么算出来的呢?

在A类型中最大对齐数为4,是整形int的大小,A中有两个类型另一个是char,char的大小是一个字节,int是四个字节加起来就是五个字节,4的整数倍是8正好大于5所以a对象的大小就是8,但是B C 的大小为什么是1呢?为什么没有成员变量还还有一个字节呢,其实这里的一个字节仅表示该类型存在纯粹是为了占位标识对象存在。

3 this指针

  • 在Date类中有 Init 和 print两个成员函数,函数体中没有关于不同函数的区分但是我们在对d1 和d2两个对象进行初始化的时候是如何进行区分的呢?解决问题的方法就是在C++中提供了this指针。
  • 编译器编译后,都会默认在类的成员函数的形参前面添加一个当前类类型的this指针,比如Date类中的Init成员函数的原型是:void Init(Date const this, int year, int month, int day)*
  • 类中的成员函数访问成员变量本质上都是通过this指针进行访问的比如在Init中给year赋值本质上是:this->_year = year
  • C++规定不能在实参和形参的位置上显示写this指针但是可以在函数体内显示使用this指针
class Date
{
public:
	// void Init (const Date* this, size_t year, size_t month, size_t day)
	void Init(size_t year = 2024, size_t month = 10, size_t day = 5)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	//只有声明,并没有分配空间
	size_t _year;
	size_t _month;
	size_t _day;
};

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

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

相关文章

解决磁盘负载不均——ElasticSearch 分片分配和路由设置

ES 分片分配&#xff08;Shard Allocation&#xff09;时间点&#xff1a; 初始恢复&#xff08;Initial Recovery&#xff09;副本分配&#xff08;Replica Allocation&#xff09;重平衡&#xff08;Rebalance&#xff09;节点添加或移除 小结&#xff1a; 准备移除节点时&a…

【Golang】关于Go语言字符串转换strconv

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先&#xff0c;需要准备三个服务器实例&#xff0c;这里我使用了阿里云创建了三个实例&#xff0c;如果不想花钱&#xff0c;也可以在VM上创…

1panel申请https/ssl证书自动续期

参考教程 https://hin.cool/posts/sslfor1panel.html #Acme 账户 #1panel.腾讯云dns账号 这里有一步不需要参考,腾讯云dns账号,就是子帐号授权 直接控制台搜索 访问管理 创建用户 授权搜索dns,选择第一个 点击用户名,去掉AdministratorAccess权限 5.点击api密钥生成即可…

CSS3练习--电商web

免责声明&#xff1a;本文仅做分享&#xff01; 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航&#xff08;shortcut&#xff09; 头部&#xff08;header&#xff09; logo 导航 搜索 购物车 底部&#xff08;footer&#xff0…

初学51单片机之I2C总线与E2PROM二

总结下上篇博文的结论&#xff1a; 1&#xff1a;ACK信号在SCL为高电平期间会一直保持。 2&#xff1a;在字节数据传输过程中如果发送电平跳变&#xff0c;那么电平信号就会变成重复起始或者结束的信号。&#xff08;上篇博文的测试方法还是不能够明确证明这个结论&#xff0…

字符串和字符数组(2)

6.求字符串长度 C语言中有一个库函数叫strlen&#xff0c;这个函数是专门用来求字符串长度的。strlen的使用需要包含一个头文件string.h。 strlen函数统计的是字符串中\0之前的字符个数&#xff0c;所以传递给strlen函数的字符串中必须得包含\0. 请看代码&#xff1a; #inc…

数据结构 ——— 单链表oj题:链表分割(带哨兵位单向不循环链表实现)

目录 题目要求 手搓简易单链表 代码实现 题目要求 现有一链表的头指针 ListNode* head &#xff0c;给一定值 x &#xff0c;编写一段代码将所有小于 x 的节点排在其余节点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头节点 举例说明&a…

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受居民的喜爱&#xff0c;社区互助服务管理系统小程序被居民普遍使用&#xff0c;为…

macOS编译和运行prometheus2.54

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文详述了在macOS(M2芯片)上编译和运行prometheus2.54版本的过程&#xff0c;以及安装node_exporter和grafana并使用prometheus指标进行展示 本地…

Redis:zset类型

Redis&#xff1a;zset类型 zset命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合间操作ZINRERSTOREZUNIONSTORE 内部编码ziplistskiplist 在Redis中&…

单片机的两种看门狗原理解析——IWDG和WWDG

一、IWDG独立开门狗的主要性能 计时机制&#xff1a; 递减计数器 独立开门狗的初始频率&#xff1a; LSI低速内部时钟&#xff1a;RC震荡器&#xff0c;40kHz 独立开门狗是以LSI为初始频率的&#xff0c;所以独立开门狗的初始时钟频率取决与单片机本身&#xff0c;因此在使…

[每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别

文章目录 1. **支持的磁盘容量**2. **分区数量**3. **引导方式**4. **冗余和数据恢复**5. **兼容性**6. **安全性**7. **操作系统支持**8. 对比 国庆假期前补一篇 在一次扫描机械硬盘故障的问题&#xff0c;发现我本机SSD和机械硬盘的分类型不一样&#xff0c;分别是GPT和MBR&a…

Matlab编程示例24:freexyn在b站的读取手写体mnist数据集的matlab代码

1.mnist手写体数据集介绍 手写数字MNIST数据库由60000个示例的训练集和10000个示例的测试集组成。这些数字已进行归一化&#xff0c;每个示例是28*28像素的图片&#xff0c;图片是黑底白字&#xff0c;每个图片的标签就是图片上的数字&#xff0c;数字范围是0~9&#xff0c;总…

记录一次病毒启动脚本

在第一次下载软件时&#xff0c;目录中配了一个使用说明&#xff0c;说是需要通过start.bat 这个文件来启动程序&#xff0c;而这个 start.bat 就是始作俑者&#xff1a; 病毒作者比较狡猾&#xff0c;其中start.bat 用记事本打开是乱码&#xff0c;但是可以通过将这个批处理…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

探索 Python 虚拟环境的奥秘:virtualenv 的魔法世界

文章目录 探索 Python 虚拟环境的奥秘&#xff1a;virtualenv 的魔法世界背景&#xff1a;为何选择 virtualenv&#xff1f;虚拟环境的守护者&#xff1a;virtualenv 是什么&#xff1f;安装 virtualenv&#xff1a;简单几步&#xff0c;开启隔离之旅掌握 virtualenv 的基本用法…

LC刷题专题:堆、大顶堆、小顶堆

文章目录 692. 前K个高频单词215. 数组中的第K个最大元素2336、无限集中的最小数字 这篇文章以后记录自己刷到的题目中与堆有关的。 692. 前K个高频单词 这个题目整体不难&#xff0c;是前k个高频元素的改进版&#xff0c;只需要在创建小顶堆时执行排序规则即可。如果出现次数…

镜头、diffuser、DOE

三种常见的光学器件&#xff1a;镜头、扩散器&#xff08;diffuser&#xff09;、衍射光学元件&#xff08;DOE&#xff09; lensdiffuserDOE镜头扩散器衍射光学器件作用聚焦或发散均匀化光束生成特定形状的光斑应用领域TOF结构光算法 1.1 镜头&#xff08;Lens&#xff09; …

微服务_3.微服务保护

文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例&#xff0c;异常数…