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.mzph.cn/news/119467.shtml

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

相关文章

uniapp实现webview页面关闭功能

实现思路: 1.关闭按钮是使用原生button添加的close属性。(见page.json页面) 2.监听关闭按钮的方法。(onNavigationBarButtonTap) 3.写实现关闭webview所有页面的逻辑。 废话不多说,直接上代码 1.page.…

《GB/T 8566-2022/ISO/IEC/IEEE:系统与软件工程生存周期过程》国家标准解读,附下载地址

关于企业架构、软件工程等相关内容,基本在行业内工作一段时间都能解释出各自的理解,网络资料更是知识爆炸,看似哪一种都对,其实相对都是个人理解,算不上严谨。 上周工作中涉及架构的企业标准编制审查,对严…

网工内推 | 国企,解决方案工程师,最高30k,有软考证书优先

01 中电信数智科技有限公司海南分公司 招聘岗位:解决方案经理(ICT) 职责描述: 1、负责调动前后端资源做好全省ICT业务的售前支撑服务工作。 2、根据实际项目需求,主动协同客户渠道开展ICT项目商机挖掘,促进…

用友U8SMSProxy -SQL注入漏洞

0x01 漏洞介绍 用友GRP-U8 R10政务管理软件是由用友政务公司基于云技术所推出的第十代政务产品。这款产品继承了用友R9、R9i、U8等行政事业版产品的各项优点,并融合了全国广大用户的最佳实践应用。它旨在为政府财政部门、社保部门、卫生部门、教育部门、民政部门、党…

【uniapp+云函数调用】人脸识别,实人认证,适用于app,具体思路解析,已实现

2023.10.8 需求: uniapp开发的app项目中使用人脸识别 app项目都是第一次搞,更别提人脸识别了。目前已有的就是Dcloud账号已申请,实现需求的时间没那么紧迫 此篇会详细记录从0到1的过程 2023.10.24 今天开始探究实现的过程 可能会记录的有些冗余 效果图如下: uniapp开发指南…

整个自动驾驶小车001:概述

材料: 1,树梅派4b,作为主控,这个东西有linux系统,方便 2,HC-S104超声波模块,我有多个,不少于4个,我可以前后左右四个方向都搞一个 3,l298n模块,…

【Linux】第三站:Linux基本指令(二)

文章目录 一、通配符 *二、man指令三、cp指令1.先给一个文件里面写入数据2. cp指令拷贝普通文件3.cp指令拷贝文件目录4.常用的选项总结 四、mv指令1.mv命令简介2.使用 五、一些插曲1.一些注意事项2.指令的本质3.再谈输出重定向4.追加重定向5.输入重定向 六、cat指令七、more指令…

springboot配置redis、Spring cache

1.Jedis库 依赖库 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version> </dependency>使用案例&#xff1a; Testpublic void jedis(){Jedis jedis new Jedis("127…

光流法动目标检测

目录 前言 一、效果展示 二、光流法介绍 三、代码展示 总结 前言 动目标检测是计算机视觉领域的一个热门研究方向。传统的方法主要基于背景建模&#xff0c;但这些方法对于光照变化、遮挡和噪声敏感。因此&#xff0c;研究人员一直在寻找更加鲁棒和有效的技术来解决这一问题。…

C# 串口通信简单示例

C# 简单串口通信示例 串口通信示例代码 串口通信 C# 串口通信主要操作&#xff1a; 命名空间&#xff1a;using System.IO.Ports;获取端口&#xff1a;string[] ports System.IO.Ports.SerialPort.GetPortNames();设置端口名&#xff1a;serialPort1.PortName “COM1”; //…

vue3中常用的新组件

一、Fragment vue2中&#xff0c;组件必须有一个根标签 vue3中&#xff0c;组件可以没有根标签&#xff0c;内部会将多个标签包含在一个Fragment虚拟元素中。 优点&#xff1a;减少标签层级。 二、Teleport&#xff08;传送门&#xff09; 作用&#xff1a;将组件的 html …

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…

C++ 模板和泛型编程详解

C中的模板和泛型编程是非常重要的概念。模板是一种将数据类型作为参数的通用程序设计方法。它们允许开发人员编写可以处理各种数据类型的代码&#xff0c;而无需为每种数据类型编写不同的代码。下面介绍了一些关于C中模板和泛型编程的重要知识点 模板的定义 模板是一种通用程序…

opencalib中lidar2camera安装记录

目录 一、opencalib安装 二、lidar2camera的安装 三、测试运行 四、出现过的问题 一、opencalib安装 代码地址&#xff1a;https://github.com/PJLab-ADG/SensorsCalibration/blob/master/README.md # pull docker image sudo docker pull scllovewkf/opencalib:v1 # Aft…

【计算机网络】HTTP 协议的基本格式以及 fiddler 的用法

HTTP协议的基本格式如下&#xff1a; 1.请求行&#xff1a; 包括请求THHP协议的版本、请求URI&#xff08;资源路径&#xff09;和HTTP方法&#xff08;如GET、POST、PUT、DELETE等&#xff09; GET/example.html HTTP/1.1 GET表示请求方法&#xff0c;/example.html表示请求的…

大语言模型(LLM)综述(三):大语言模型预训练的进展

A Survey of Large Language Models 前言4. PRE-TRAINING4.1数据收集4.1.1 数据源4.1.2 数据预处理4.1.3 预训练数据对LLM的影响 4.2 模型架构4.2.1 典型架构4.2.2 详细配置4.2.3 预训练任务4.2.4 解码策略4.2.5 总结和讨论 4.3 模型训练4.3.1 优化设置4.3.2 可扩展的训练技术 …

TypeScript之索引签名

1. 索引签名 在 TypeScript 中&#xff0c;索引签名是一种定义对象类型的方式&#xff0c;它允许我们使用字符串或数字作为索引来访问对象的属性。 索引签名最主要的作用就是允许我们动态地添加或访问对象的属性&#xff0c;通过使用索引签名&#xff0c;我们可以在编译时无法…

【Linux】线程同步

线程同步 线程仅仅互斥&#xff0c;是可以保证线程安全的。但是&#xff0c;这不合理&#xff01;如果一个线程竞争到了锁&#xff0c;那么再它释放后它依然可以竞争个锁。因为CPU此时正在执行当前线程&#xff0c;所以该线程又可以继续竞争锁。 这样就会造成一个问题&#xf…

Python 继承和子类示例:从 Person 到 Student 的演示

继承允许我们定义一个类&#xff0c;该类继承另一个类的所有方法和属性。父类是被继承的类&#xff0c;也叫做基类。子类是从另一个类继承的类&#xff0c;也叫做派生类。 创建一个父类 任何类都可以成为父类&#xff0c;因此语法与创建任何其他类相同&#xff1a; 示例&…

【计算机网络】从输入URL到页面都显示经历了什么??

文字总结 ① DNS 解析&#xff1a;当用户输入一个网址并按下回车键的时候&#xff0c;浏览器获得一个域名&#xff0c;而在实际通信过程中&#xff0c;我们需要的是一个 IP 地址&#xff0c;因此我们需要先把域名转换成相应 IP 地址。浏览器会首先从缓存中找是否存在域名&…