C++中的类的引入

一、类的引入

在C语言的结构体中只能定义变量;在C++的结构体中,不仅可以定义变量,还可以定义函数。

例如,在用C语言实现栈时,结构体struct中只能定义变量;但是如果用C++实现,结构体中还可以定义函数。

#include <iostream>
using std::cout;
using std::endl;typedef int DataType;struct Stack {DataType* _a;int _size;int _capacity;//初始化void Init(int capacity){_a = (DataType*)malloc(sizeof(DataType) * capacity);if (_a == nullptr){perror("malloc fail");exit(-1);}_capacity = capacity;_size = 0;}//扩容void check_capacity(){if (_size == _capacity){//int newcapacity = _capacity == 0 ? 4 : 2 * _capacity;int newcapacity = 2 * _capacity;DataType* tmp = (DataType*)realloc(_a, sizeof(DataType) * newcapacity);if (tmp == nullptr){perror("realloc fail");exit(-1);}else{_a = tmp;_capacity = newcapacity;}}}//入栈void Push(DataType data){check_capacity(); //扩容函数略_a[_size] = data;_size++;}//出栈DataType Top(){return _a[_size--];}//销毁void Destory(){if (_a){free(_a);_a = nullptr;_size = 0;_capacity = 0;}}//打印void Print(){for (int i = 0; i < _size; i++){cout << _a[i] << " ";}cout << endl;}
};int main()
{struct Stack s;s.Init(5);s.Push(1);s.Push(2);s.Push(3);s.Push(4);s.Push(5);s.Print();s.Top();s.Top();s.Print();s.Push(4);s.Push(5);s.Push(6);s.Push(7);s.Push(8);s.Print();s.Destory();return 0;
}

在C++中,更喜欢用class来代替结构体struct的定义

class className {//类体:由成员函数和成员变量组成
};

二、类的定义

类的定义有两种方法:

1.声明和定义全部放在类体中(成员函数在类中定义,编译器可能会将其当成内联函数处理)

class Date {
private:int _year;int _month;int _day;public://初始化void Init(int year, int month, int day){_year = year;_month = month;_day = day;}//打印void Print(){cout << _year << " " << _month << " " << _day << endl;}
};

2.声明和定义分离,类声明放在.h文件中,成员函数定义放在.cpp文件中

//func.h 类声明
class Date {
private:int _year;int _month;int _day;public://初始化void Init(int year, int month, int day);//打印void Print();
};//func.cpp 成员函数定义
void Date::Init(int year, int month, int day)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << " " << _month << " " << _day << endl;
}//test.cpp 测试
int main()
{Date d1;d1.Init(2024, 1, 31);d1.Print();return 0;
}

三、类的访问限定符

C++中有三种访问限定符:public(公有)、private(私有)、protected(保护)

public修饰的成员在类外可以直接被访问

private和protected修饰的成员在类外不能直接被访问

访问限定符的作用域:

访问限定符的作用域是从该访问限定符出现的位置到下一个访问限定符出现的位置(如果后面没有访问限定符了,就到类结束位置)

四、类的实例化

通过类实例化出对象,其实类似于通过图纸建造出房子,类就是设计图,对象就是房子。

因此类并不占据实际的空间,只有当类实例化出对象了,才实际存储数据,占用内存空间。

所以,类中的成员变量其实只是声明,并不是定义,它们并不占据存储空间。

如上代码,Data即是一个类,而d1则是其实例化出的一个对象。

五、类对象的存储方式

类中只保存成员变量,而成员函数保存在公共的代码段

sizeof(类) 和 sizeof(对象) 意义是一样的,都是在计算类实例化出的对象的大小

一个类的大小,实际就是经过内存对齐后成员变量的大小之和。对于空类而言比较特殊,编译器会给予空类一个字节,来唯一标识这个类的对象

class A {int a;char b;
};class B
{int a;int b;void func(){cout << "func()" << endl;}
};class C
{};int main()
{cout << sizeof(A) << endl;//8,结构体对齐规则cout << sizeof(B) << endl;//8,成员函数存储在公共代码段,不在类中cout << sizeof(C) << endl;//1,空类编译器会给予1字节来唯一标识该空类return 0;
}

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

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

相关文章

qt语言国际化(翻译),并实现多窗口同时翻译

一、.pro文件中添加支持的语言 在.pro文件中添加下面几句&#xff0c;支持中文和英文 TRANSLATIONS lanague_cn.ts\lanague_en.ts二、通过qt语言家更新翻译生成.ts文件 完成以后在工程目录可以看到.ts文件 三、通过linguist翻译文件 打开文件 将两个文件同时选中&#xf…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

c# 海康照相机操作封装类(网口,USB)

需求 在上位机开发中, 海康照相机的使用应该是很常见的,主要是网口通讯的相机用的多,有时也会用一些USB接口相机。以前项目都在赶时间做。没有时间去好好设计和封装。时间长了发现重复代码就很多,还有没有设计和封装的代码,代码份数和相机个数对等,说白了就是一个相机写一…

【优秀案例】回本周期缩短10%!日安装量级高达5000以上!看NetMarvel如何赋能Ball Sort达成多项目标

“合成大西瓜在海外火了” 没想到&#xff0c;在国内已经过气的玩法转战到海外后&#xff0c;还能够翻红的这么彻底&#xff1f; 实际上&#xff0c;市面上很多在本土市场不温不火但转战海外赛道却盈利感人的应用不在少数&#xff0c;比如我们今天的重头戏《Ball Sort - Colo…

iView 中DatePicker日期选择器 v-model不生效的情况

场景 公司项目前段使用的是iview样式库&#xff0c;在开发的过程中&#xff0c;需要使用到时间选择器 使用后发现&#xff0c;输出的时间格式有问题&#xff0c;查看了需要使用到format来设置输出内容&#xff0c;发现不生效 百度… 1、百度后了解到v-model和format使用&…

基于Element的进度条Loading

基于Element的进度条loading组件 前端在中后台项目开发中经常要使用到loading遮罩层在数据交互时展示&#xff0c;目前我使用element组件库的loading&#xff0c;发现不能自定义&#xff0c;loading的样式比较少&#xff0c;官方只提供修改loading的图标和文字。 但是我的需求…

【云上建站】快速在云上构建个人网站4——网站备案

快速在云上构建个人网站4——网站备案 一、为网站配置域名1、使用域名的原因2、域名使用逻辑3、域名配置流程 二、域名注册1、查询域名&#xff1a;2、确认订单&#xff1a;3、实名认证域名4、域名解析配置解析域名&#xff1a;解析设置&#xff1a;访问域名&#xff1a; 一、为…

【深度学习:多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型

【深度学习&#xff1a;多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型 Meta 发布开源人工智能工具的历史分段任何模型DINOv2 什么是多模态学习&#xff1f;什么是嵌入&#xff1f;什么是 ImageBind&#xff1f;集成在 ImageBind 中的模式图像绑定架构特定模式编码器跨…

Flask框架开发学习笔记《6》前后端不分离基础框架

Flask框架开发学习笔记《6》前后端不分离基础框架 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 主要包含如下文件&#xff1a; static 目录中存储了图片templates 目录中存储了 html 文件utils.py 包含了 log 函数server.p…

资深Android逆袭、华为鸿蒙为安卓程序员开辟了一条新道路

本文章主要从以下5个方面来展开聊聊这个话题&#xff1a; 1.什么是鸿蒙 2.鸿蒙系统发展时间线 3.鸿蒙是套壳Android吗&#xff1f; 4.鸿蒙的生态&#xff08;用户以及开发者&#xff09; 5.一些建议 1月18日&#xff0c;在鸿蒙生态千帆启航仪式上&#xff0c;华为宣布了继鸿蒙4…

实现单点登录

指再多系统应用群中登录一个系统&#xff0c;便可在其他所有系统中得到授权而无需再次登录&#xff0c;包括单点登录与单点注销两部分。 相比于单系统登录&#xff0c;sso需要一个独立的认证中心&#xff0c;只有认证红心能接受用户的用户名密码等安全信息&#xff0c;其他系统…

C#,打印漂亮的贝尔三角形(Bell Triangle)的源程序

以贝尔数为基础&#xff0c;参考杨辉三角形&#xff0c;也可以生成贝尔三角形&#xff08;Bell triangle&#xff09;&#xff0c;也称为艾特肯阵列&#xff08;Aitkens Array&#xff09;&#xff0c;皮埃斯三角形&#xff08;Peirce Triangle&#xff09;。 贝尔三角形的构造…

Python办公自动化:解锁高效工作流程,掌握文档处理的艺术

1.python自动化办公 Python 在自动化办公方面非常强大和灵活&#xff0c;能够帮助提高工作效率&#xff0c;自动化完成重复性任务。Python 提供了多种库和工具&#xff0c;可以用于处理文档、电子表格、PDF 文件、电子邮件等。下面是一些常用的 Python 自动化办公库及其应用&a…

大创项目推荐 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

题记(35)--日期累加

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 设计一个程序能计算一个日期加上若干天后是什么日期。 二、输入描述 输入第一行表示样例个数m&#xff0c;接下来m行每行四个整数分别表示年月日和累加的天数。 三、输出描…

鸿蒙 ArkTS 从数组内查找指定的数据

let arr [1, 2, 3, 4, 5]; let target 3; let result arr.filter(item > item target); let a String(result) 将数字转换成文本型 console.log(a); 亲爱的读者&#xff1a; 首先&#xff0c;我要感谢您抽出宝贵的时间阅读这篇文章。我深知&#xff0c;您的每一分每一…

新概念英语第二册(47)

New words and expressions】生词和短语&#xff08;9&#xff09; thirsty adj. 贪杯的 ghost n. 鬼魂 haunt v. &#xff08;鬼&#xff09;来访&#xff0c;闹鬼 block …

深入解析Lombok中的@SneakyThrows注解原理

在Java开发中&#xff0c;异常处理一直是一个重要的部分。Java中的异常分为受检查异常&#xff08;checked exceptions&#xff09;和未受检查异常&#xff08;unchecked exceptions&#xff09;。受检查异常需要在方法签名中显式声明&#xff0c;或者在方法体内部捕获处理&…

Codeforces Round 479 (Div. 3)

这一场div3整体比较简单注意细节即可 目录 A. Wrong Subtraction B. Two-gram C. Less or Equal D. Divide by three, multiply by two E. Cyclic Components F. Consecutive Subsequence A. Wrong Subtraction 按照题目意思直接模拟操作次数即可 void solve(){cin>…

05 MyBatis之表关系的声明+事务+SqlSession三件套的作用域

MyBatis 支持一对一&#xff0c;一对多&#xff0c;多对多查询。XML 文件和注解都能实现关系的操作。多对多实质就是一对多 1. 表关系的维护 1.1 One一对一 一对一查询和多表(两表)查询很相似, 都能查询两表的全部属性 区别是一对一可以在对象中嵌套对象, 呈现包含关系; 多表…