c++类和对象(1)

目录

目录:

        1.类的定义

                       1.1:类的语法及相关概念

                       1.2:类的两种定义方式

                        1.3:类的成员变量名命名规范

        2.类的访问限定符

                  2.1:三种访问限定符关键字引入

                  2.2:访问限定符的语法说明

                  2.3:c++中struct与class的区别(面试常考)

        3.类的作用域

        4.类的实例化

        5.类对象

                5.1:类对象大小的计算

                5.2:类中对象存储方式猜测

                5.3结构体内存对齐规则

        6.this指针

                6.1:为什么要有this指针

                6.2:this指针的特性


         1:类的定义

        在c++中定义类的关键字为class,struct也可以用来定义类。

        类定义的语法:class 类名{....成员变量    ....成员函数};

        structclass定义类语法相同.在{....}中的内容又称为类体类体中变量称为成员变量类的属性,类中的函数称为类的方法成员函数。

        类定义的两种方式

        1:将类的声明与定义放在不同的源文件中,声明放在.h,定义放在.cpp中,这时候我们在.cpp文件中还需要在函数面前加上类名::,用来告诉编译器这是那个成员函数是属于那个类的。需要注意的是当我们在类中定义成员函数时,这个成员函数为内联函数,但是具体展不展开就需要看编译器了。

        .h文件中声明

        

        .cpp文件中定义

       2:将类的声明与定义同时放在类体中。与上面需要注意的一样,在类中定义的都是内联函数

        

          3.类的成员变量命名规则

               在讲这个小语法之前,我们先上一段代码。

        

         我们本来写了一个方法是想初始化我们的年月日,可是在函数内部左边的year就是我们所用的成员变量吗?很显然并不是的,因为我们知道在一个函数内部局部变量是先于全局变量的。

        所以我们的c++为了不造成这样的命名冲突,所以就有了如下图代码的命名规则。

        

  2:类的访问作用符

        类的访问作用符有三种分别是:private(私有),public(公有),protected(保护).

        区分私有,公有,保护的三种限定符主要的区别是在类外能否访问内部的成员函数或成员变量

        私有与保护:在类外不能直接进行访问。 公有:在类外能够进行访问

        私有与保护肯定也是有区别的。这个知识点后续会讲。

        c++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将接口提供给外部的用户使用

一般而言我们对于成员变量设置为私有,成员方法(函数)设置为公有

        访问权限限定符的作用域为当前访问限定符到下一个访问限定问,如果没有下一个访问限定符,就到类结束}时.

        我们通过例子来讲解这段话。

        

        需要记住的是:class与struct都可以定义类,但是区别就在于 class默认的访问权限为私有的struct默认的访问权限是公有的(为了支持c语言中struct的用法.)

        我们可以很清楚的看到我们的d2(class定义的类)在默认的情况下是不能够进行访问的,因为class定义的类的默认访问权限是私有的是不能直接在类外进行访问的。

        c++中struct与class的区别

        1:两者都可以定义类,但是默认的访问权限不同,class为私有,struct为公有。

        2:c++中struct还可以支持c语言中的语法。

        3:类的作用域 

        类的定义也增加了一个作用域,因为加了这个{...},这里的作用域的语法其实在我们将类的声明与定义分离的时候常见,当他们分离的时候我们定义函数时,需要在函数名加上类名::的语法,用来告诉编译器我们的函数来自哪。

        4:类的实例化

                定义:用类来创建对象的过程,称为类的实例化。

                其实在定义完类的时候,我们并没有直接给类进行初始化,因为类的初始化是要在内存中开辟相应的内存空间的,而我们在定义完类只是对类进行声明。

                类的实例化的本质其实就是来定义类的,给类开辟相应的内存空间。 

                我们要注意的是,一个类可以实例化出多个对象,我们可以将理解成设计图,而实例化出的对象可以看做房子,类vs对象  1v多。

 

        5:类对象 

                1:类对象大小的计算

                我们已经学过定义类了,并且也知道通过类我们可以创建出对象,那么类的大小如何计算呢?

        很显然我们可以根据类的定义就知道,类中既有成员变量,又有类的方法,难道类的大小为类成员变量类型的大小加上类方法的大小就行了吗?

         首先在这里我们直接公布结论,原因在下面的知识点会介绍。

        类的大小=只包含成员变量的大小,但是需要考虑成员变量的内存对齐。

        至于是如何对齐的其实在c语言阶段我们已经详细的讲过了,如果你有什么疑问的话,可以去看看博客中c语言结构体那一张节。

        在这里我们还需要记住一个特殊的类:空类

        空类它是既没有成员变量也没有成员函数,大小为1.

        这个1是用来标识定义的对象存在。

        

        我们直接通过1个例子来计算类的大小

         

        根据结构体内存对齐的规则:

        1:第一个成员在与结构体偏移量为0的地址处

        2:其他成员变量需要对齐到对齐数的整数倍处

                对齐数:变量的大小与编译器默认的对齐数较小的那个

        3:结构体最终的大小为最大对齐数的整数倍。

        4:如果含有嵌套结构体,那么嵌套结构体对齐到自己最大对齐数的整数倍处,最终的大小为所有对齐数最大的整数倍处,包括嵌套结构体中对齐数。

         所以上述的答案为12.如果看了这个规则还是不会算的话,可以通过画图来理解。

        类中变量的存储方式猜测

        1:类中成员变量与方法都存在于类中

                显然这种猜测是不成立的,因为当我们定义多个类的时候,他们方法的逻辑是一样的,如果我们给每个方法都开辟一块内存空间的话,那么就太浪费了,这种猜测显然是不合理的。

        2:类中存放函数变量,方法存在公共的地方。

        这种猜测其实就是类成员与变量存储的真实方式。

        

        6:this指针

        this指针是在栈区上开辟的,是一个函数的形参。但是这个函数的形参不能显示的使用但是能在函数体中使用。

        我们知道当我们使用类来创建不同的对象的时候,他们都会有公共的方法,且我们通过前面的学习知道,方法是存储在一块公共的地址处的,那么我们如何来区分不同对象调用相同的函数呢?

        所以c++为了解决这个问题,才引入了this指针这个语法。

        我们需要知道当我们通过对象来调用相应的函数的时候,其实我们的编译器在编译的时候会将对象的地址隐藏的传过去,而在相应方法形参中也会有一个相应的this指针存在,这里可能有点抽象我们通过相应的代码来解释。

          

          

        c++this指针的定义是这样的

        c++编译器会给每一个”非静态成员函数”增加一个隐藏的指针参数,让该指针指向当前的对象(那个对象在调用该函数),在函数体中所有成员变量的访问,都是通过this指针去访问的。只不过用户是透明的,是编译器在默默无闻的做这些事情的。 

                

        this指针的特性

        1:this指针的类型是* const,如Date * const this ,这也另外的说明了我们的this的指向是不能改变的。

        2:this指针只能在成员函数中使用。

        3:this指针本质上是成员函数的形参,当对象调用该函数的时候,this为该对象的地址,所以this指针不是存在对象中的。

        4:this指针是成员函数的第一个隐含的形参,不需要用户进行传递。

         

       本章结束,感谢大家的观看!!!

          

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

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

相关文章

adb: error: 46-byte write failed: Invalid argument

使用adb pull可以,但是adb push fail。 貌似是adb的问题,将adb.exe 重命名为pdb,使用pdb push就行了。

二、【常用的几种抠图方式一】

文章目录 选框抠图快速选择工具抠图魔棒工具抠图对象选择工具抠图套索工具抠图多边形套索工具抠图磁性套索工具抠图 选框抠图 选框工具抠图适合规则的图形,如下图先使用选框工具框出对象的图轮廓,然后再选择并遮住在里边擦出图形的边缘,根据…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题(√)二、2021年真题(√)三、2020年真题(√)四、2019年真题(√)五、2018年真题(√)六、2017年真题(√)七、201…

百度Comate SaaS版本正式发布,助力开发者加速研发过程

百度Comate是基于文心大模型的智能代码助手,让开发者的编码更快、更好、更简单,为开发者自动生成完整的、且更符合实际研发场景的代码行或整个代码块,帮助每一位开发者轻松完成研发任务。10月17日召开的百度世界大会上,百度CTO王海…

酷开科技依托酷开系统推动家庭智能化加速发展

为什么越来越多的人会选择智能家居?因为智能家居的出现,大大方便了我们的生活,为生活提供便利舒适的体验;就如同洗衣机与洗碗机解放了我们的双手是一样的道理,智能家居是在生活的方方面面为我们提供更加便利化的可能性…

p5.js 状态管理

本文简介 带尬猴,我是德育处主任 原生 canvas 提供了 save() 和 restore() 两个方法去管理画布状态。p5.js 作为一个 canvas 库,也理所当然的提供了状态管理的方法。在 p5.js 里这两个方法叫 push() 和 pop()。 本文主要讲解 p5.js 的 push() 和 pop()…

基于java的ssm框架农夫果园管理系统设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

python爬虫入门(四)爬取猫眼电影排行(使用requests库和正则表达式)

本例中,利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。 1.目标 提取出猫眼电影 TOP100 的电影名称、时间、评分、图片等信息,提取的站点 URL 为 http://maoyan.com/board/4,提取的结果会以文件形式保存下来。 2.抓取分析…

vscode推送gitee方法

有一套uni-app代码需要修改,版本控制使用vscode的git功能,远程库在gitee上。 1、设置vscode中git.exe路径 由于git使用了绿色便携版(PortableGit-2.42.0.2-64-bit.7z.exe),vscode未识别到git安装路径,需要…

OKLink携手CertiK在港举办Web3生态安全主题论坛

2023年10月23日,OKLink与CertiK共同发起的Web3生态安全主题论坛在香港铜锣湾拉开帷幕。本次论坛由OKLink和CertiK主办,香港投资推广署独家支持,聚焦如何构建安全可靠的Web3生态系统议题,同时深入剖析这一进程中所面临的潜在挑战。…

OkHttp网络框架深入理解-SSL握手与加密

OkHttp简介 由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.4开始HttpURLConnection的底层实现采用的是OkHttp。 特点: 支持HTTP/2并允许对同一主机的所有请求共享一个套接字通过连接池,减少了请求延迟…

每日汇评:黄金争取本周收于2000美元上方

在周五美国个人消费支出通胀之前,金价巩固了周四的双向价格走势; 在市场情绪改善之际,美元与美债收益率一同下跌; 黄金价格在日线图上确认了一个多头标志,相对强弱指数仍然指向更多的上涨; 周五早盘&#x…

万能鼠标设置 SteerMouse v5.6.8

鼠标可谓是用户们在使用电脑时候的必备外接设备呢!适合你自己的鼠标设置也绝对能够优化你的Mac使用体验!想要更好的Mac体验就试试用Steermouse Mac版吧。它通过软件来自由设置你的鼠标操作!在这款万能鼠标设置工具中,用户可以在偏…

Hadoop3.0大数据处理学习4(案例:数据清洗、数据指标统计、任务脚本封装、Sqoop导出Mysql)

案例需求分析 直播公司每日都会产生海量的直播数据,为了更好地服务主播与用户,提高直播质量与用户粘性,往往会对大量的数据进行分析与统计,从中挖掘商业价值,我们将通过一个实战案例,来使用Hadoop技术来实…

【STM32】HAL库ADC多通道精准测量(采用VREFINT内部参考电压)

【STM32】HAL库ADC多通道精准测量(采用VREFINT内部参考电压) 文章目录 多通道测量VREFINTADC采样周期多通道配置 附录:Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作…

【蓝桥杯选拔赛真题03】C++输出字母Y 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++输出字母Y 一、题目要求 1、编程实现 2、输入输出 二、算法分析

GMT中标注特殊字符:平方,%,±号,希腊字母

在gmt中文社区的官网,我们可以得到以下的特殊字符表,通过在cmd命令窗口输入以下命令 gmt get PS_CHAR_ENCODING 查到你所安装的GMT的默认字符编码方式。如下图所示,本人是默认的ISOLation1 编码。 下面是一些具体的特殊字符的代码与标注效果…

Postgresql在jdbc处理bit字段的解决方案

问题: bit如果长度为1,则会默认为布尔型(1-true 0-false); bit如果长度大于1,则会默认为bit类型,但是代码中以前常用的两种set方式,会报错 第一种方式: ps.setObject(i1,…

Facebook账号被封?那是因为没做对这些事

Facebook是全球最大的社交媒体平台之一,拥有数十亿的全球用户。它的主要产品包括Facebook(面向个人用户的社交媒体平台)、Instagram、WhatsApp和Messenger。同时他也是美国数字广告市场的主要参与者之一,其广告平台吸引了数百万广…

超越YOLOv8?基于Gold YOLO的自定义数据集训练

Gold-YOLO的出色性能是对Noahs Ark Lab团队的奉献和专业知识的证明。它不仅超越了其前身YOLOv8,还为实时目标检测设定了新标准。凭借其闪电般快速的处理能力和出色的准确性,Gold-YOLO承诺革命化一系列应用,从自动驾驶车辆到监视系统等等。 我…