从零开学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.mzph.cn/bicheng/44374.shtml

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

相关文章

Android liveData 监听异常,fragment可见时才收到回调记录

背景&#xff1a;在app的fragment不可见的情况下使用&#xff0c;发现注册了&#xff0c;但是没有回调导致数据一直未更新&#xff0c;只有在fragment可见的时候才收到回调 // 观察通用信息mLightNaviTopViewModel.getUpdateCommonInfo().observe(this, new Observer<Common…

[嵌入式 C 语言] 按位与、或、取反、异或

若协议中如下图所示&#xff1a; 注意&#xff1a; 长度为1&#xff0c;表示1个字节&#xff0c;也就是0xFF&#xff0c;也就是 1111 1111 &#xff08;这里0xFF只是单纯表示一个数&#xff0c;也可以是其他数&#xff0c;这里需要注意的是1个字节的意思&#xff09; 一、按位…

第三课网关作用

实验拓扑图&#xff1a; 基础配置&#xff1a; PC1的基础配置 PC2的基础配置&#xff1a; PC4的基础配置 AR1添加PC4网段: 并且添加pc1,pc2的网段。 并且添加pc1,pc2的网段。 原理&#xff1a;PC4先把数据交给100.100.100.1&#xff0c;交给了路由器&#xff0c;路由器再把数…

瑞萨RH850 RTC计时进位异常

RH850 MCU的RTC&#xff08;实时时钟&#xff09;采用BCD&#xff08;二进制编码的十进制&#xff09;编码格式&#xff0c;支持闰年自动识别&#xff0c;并具有秒、分、时、日、周、月、年的进位功能。其中&#xff0c;秒和分为60进位&#xff0c;时为12或24进位&#xff0c;周…

Qt Design Studio 4.5现已发布

Qt Design Studio现已强势回归&#xff0c;生产力和可用性均得到大幅提升。无论是直观的3D编辑界面&#xff0c;还是与Figma和Qt Creator的无缝连接&#xff0c;新版Qt Design Studio将为您带来更好的产品开发体验。快来深入了解Qt Design Studio的全新功能吧&#xff01; 为3…

期权交易必须弄懂的期权波动率是什么?

今天带你了解期权交易必须弄懂的期权波动率是什么&#xff1f;波动率是金融资产价格波动的度量&#xff0c;它衡量了资产的收益率的不确定性&#xff0c;常用于反映金融资产的风险水平。 期权波动率是衡量资产价格偏离平均值的程度&#xff0c;偏离程度越大&#xff0c;期权波…

Animate软件基础:重命名图层或文件夹

默认情况下&#xff0c;Animate 会按照创建顺序向新图层分配名称&#xff1a;图层 1、图层 2&#xff0c;依此类推。为了更好地反映图层的内容&#xff0c;可以对图层进行重命名。 如果需要对图层或图层文件夹进行重命名&#xff0c;请执行下列操作之一&#xff1a; 双击时间轴…

迂回战术:“另类“全新安装 macOS 15 Sequoia beta2 的极简方法

概述 随着 WWDC 24 的胜利闭幕&#xff0c;Apple 平台上各种 beta 版的系统也都“跃跃欲出”&#xff0c;在 mac 上自然也不例外。 本次全新的 macOS 15 Sequoia&#xff08;红杉&#xff09;包含了诸多重磅升级&#xff0c;作为秃头开发者的我们怎么能不先睹为快呢&#xff1…

一条SQL查询语句是如何执行的?

以一条简单的SQL为例。 mysql> select * from T where ID10&#xff1b; 我们看到的只是一条输入语句&#xff0c;但是在MYQL里面有他的一套执行流程&#xff0c;今天来分析一下这个问题。 基本架构图 首先&#xff0c;给出MYSQL的基本架构图。MYSQL可以分成Server层和存…

ARM功耗管理标准接口之ACPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…

Outlook邮件提醒通知功能详解:设置教程!

Outlook邮件提醒通知使用指南&#xff1f;如何个性设计邮件通知&#xff1f; 为了帮助用户更好地管理邮件&#xff0c;Outlook提供了强大的邮件提醒通知功能。AokSend将详细介绍如何设置和使用Outlook邮件提醒通知功能&#xff0c;以提高工作效率和管理时间的能力。 Outlook邮…

AI自动生成PPT哪个软件好?揭秘5款自动生成PPT的工具

在职场的竞技场上&#xff0c;演示文稿如同战士的利剑&#xff0c;其锋芒直接影响着演讲者的说服力。 然而&#xff0c;制作一份高质量的PPT往往需要耗费大量时间与精力。随着科技的进步&#xff0c;AI自动生成PPT成为了提升效率的新选择。面对市场上琳琅满目的软件&#xff0…

C++报警:warning: zero as null pointer constantstddef.h

源码和警告内容 解决办法&#xff1a; select(0,nullptr,nullptr,nullptr,&delay); 关于NULL和nullptr的区别&#xff1a; 在C中&#xff0c;nullptr和null&#xff08;通常指的是NULL宏&#xff0c;因为C标准中并没有直接定义null关键字&#xff09;都用于表示空指针&am…

C++:入门基础

目录 C版本 C参考文档 C输入输出 C对比C 命名空间 相较C语言它存在的意义 命名空间的使用 缺省参数 全缺省 半缺省 函数重载 引用 注意事项 引用和指针的关系&#xff08;区别&#xff09; inline 为什么要有inline&#xff1f; 注意事项 nullptr C版本 时间…

今天小编强烈推荐几款国产APP!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 今天小编强烈推荐几款国产APP,算得上是国产之光。如果能帮助到大家&#xff0c;别忘了给小编点点赞加关注哟&#xff01;更多精彩还在后面。 一、…

新国立祭出视频生成“无限宝石“:2300帧仅需5分钟,提速100倍

天下武功唯快不破—— 火云邪神 前一段时间&#xff0c;想必大家都有被各种文生视频给刷屏&#xff0c;但当看完之后&#xff0c;不知道大家是否都有一种意犹未尽的感觉&#xff1a;“这也太短了吧&#xff0c;我还没看够呢”。受限于机器资源与生成效率&#xff0c;目前大部分…

WebRTC批量发送消息API接口的特性有哪些?

WebRTC批量发送消息api接口怎么样&#xff1f;接口性能怎么用&#xff1f; WebRTC技术允许浏览器和移动应用进行实时通信。通过WebRTC&#xff0c;开发者可以构建视频、语音、数据共享等应用。AokSend将重点探讨WebRTC批量发送消息API接口的特性。 WebRTC批量发送消息API接口…

关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划

之前&#xff1a;antdv 现在&#xff1a;g2plot https://g2plot.antv.antgroup.com/manual/introduction 录课内容&#xff1a;快速入门 图表示例&#xff1a; 选择使用比较广泛的示例类型&#xff0c;录课顺序如下&#xff1a; 1、折线图2、面积图3、柱形图4、条形图5、饼…

W外链短网址平台怎么样?抖音/小红书/快手/微信卡片生成

在当今数字化时代&#xff0c;网址的便捷性和易记性对于用户体验和网站推广至关重要。短网址技术应运而生&#xff0c;以其简洁、易记、方便分享的特性&#xff0c;逐渐成为网站优化和推广的重要手段之一。其中&#xff0c;W外链作为一个功能全面的短网址服务平台&#xff0c;以…

一文彻底搞懂性能测试

性能测试概念 我们经常看到的性能测试概念&#xff0c;有人或称之为性能策略&#xff0c;或称之为性能方法&#xff0c;或称之为性能场景分类&#xff0c;大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。 针对这些概念&#xff0c;我不知道你看到的…