C++ 类和对象篇(一) 类的引入

news2025/1/21 15:28:21

目录

一、类的概念

二、类的引入

三、类的定义 

1.定义一个类

2.struct 和 class 的区别

3.类中成员函数的声明、实现分离

四、封装及类的访问限定符

1.封装

2.类的访问限定符       

五、类的作用域和生命周期

六、类的实例化

七、类存储方法

八、计算类的大小


一、类的概念

1.是什么?

        是对有相同属性和行为的事物的抽象。


2.为什么?

        把有关联的数据和函数放在一起方便管理,且类是面向对象编程的前提。


3.怎么用?

        把要描述的事物的属性和行为(用函数实现)放在一起形成一个类。


二、类的引入

1.struct升级为类        

        在C++中 struct 不但兼容C语言中结构体的语法,而且 struct 在C++中升级成了类。


2.类中能定义函数
        类包含两个部分成员变量、成员函数。所以在C++中,结构体内不仅可以定义变量,也可以定义函数。


3.class也能定义类

        除struct外,C++中还能使用class来定义类,在C++中更常用class来定义类。

拓:struct 在 C 和 C++ 中的细微区别

1.C中使用typedef重命名结构体在,最后一行之后才生效,结构体中使用结构体名也必须带上struct。


2.C++中甚至不需要使用typedef重命名就可直接在类中使用类名。


三、类的定义 

1.定义一个类

class className //法一
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号

struct structName //法二
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号
        class(或struct)为定义类的关键字,className(structName)为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
        类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数

2.struct 和 class 的区别

C++中既可以使用struct定义类,也可以使用class定义类,二者的区别在于:
        在不加限定符的情况下,struct默认为公有,class默认为私有。

拓: 类的访问限定符       

3.类中成员函数的声明、实现分离

a. 成员函数的 声明和实现 全部放在类体中,需注意:成员函数如果在类中定义,编译器 可能 会将其当成内联函数处理。

b. 成员函数的声明放在.h文件中,成员函数实现放在.cpp文件中。
(注意:当声明和实现分离时,因为声明在类域中,故定义时 成员函数名前需要加上 类名和域作用限定符(::),才能找到该类。

        

在大型项目中推荐把类中成员函数和普通函数一样,将声明和实现分离,类中成员函数声明和定义分离的意义在于方便阅读代码

拓1、成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

        声明和实现分离后,类的成员函数就不会再被当成内联函数了。(内联函数的声明和实现不能分离,内联函数不会进符号表,链接时靠声明无法找到实现的地址)


拓2、在声明和定义分离时:如果定义时中我们不加类的域名,这时类域中和全局域中就会出现两个同名函数,这是可行的且不构成函数重载。(在不同域中的函数不构成重载)   


四、封装及类的访问限定符

1.封装

1.是什么?

        本质上是对数据的管理:隐藏对象的属性和方法的实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。


2.为什么?

        提高程序的安全性和可维护性(改进的难易程度)。


3.怎么做?

         C++实现封装的方式:用类将属性与方法结合在一块,通过设置访问权限选择性的将其接口提供给外部的用户使用。  

2.类的访问限定符       

public(公有)、private(私有)、protected(保护)


五、类的作用域和生命周期

1.类的作用域

         类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域 


2.类的生命周期

        类的生命周期和存储位置有关,如:全局的类和静态的类存储在静态区,它的生命周期就是整个工程,在函数中的类,生命周期随着这个函数……


六、类的实例化

用类创建对象的过程,称为类的实例化。一个类可以实例化出多个对象。


        类不占空间,实例化成对象后才会占用空间,用于存储类成员变量。但是我们也可以通过类计算对象占用的空间大小。

        同理,定义结构体不占空间,定义结构体变量才会占用空间,但是我们也可以使用sizeof结构体名来计算结构体变量占用的空间大小。 


七、类存储方法

类存储方法猜想一:将成员函数的地址和成员变量都存起来

存在问题:调的成员函数都是一样的,所以没必要都每个对象都存一个成员函数的地址

类存储方法猜想二:将成员函数的地址单独存放进一张表中,然后存储时多存一个表的地址

这种方法没有什么问题,但在这里没有被采用。

类存储方法猜想三:只存成员变量,将成员函数统一存放在公共代码区。

这个方案就是类的存储方案,运行时不会在对象中找函数的地址,编译链接时才会根据函数名去公共代码区找到函数的地址。

所以类在遇到如下情况,程序不会崩溃。(因为找成员函数的地址不是在类中找,是去公共代码区找,所以类被实例化为nullptr我们依然能够调用成员函数)

 


八、计算类的大小

1.计算成员变量的大小

        类和结构体的一样,也遵守内存对齐规则,从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个。最后整个类也必须要对齐:类的大小必须是默认对齐数的整数倍。

2.计算成员函数的大小

        算类的大小时,不用考虑成员函数,故不用加上函数指针的大小。

3.计算空类的大小

        注意,没有成员变量的类(包括空类)的大小为1字节,不存储数据,目的是为了占位,标识对象存在,区分不同的对象。


总结:

        计算类的大小就是按照内存对齐的方式计算成员变量的方法。

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

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

相关文章

Gazebo打不开

问题:启动Gazebo半天打不开,无反应 原因:启动Gazebo,会优先从网络上下载模型 解决方案: 1.断网,然后再启动Gazebo 2.把模型下载下来 模型下载链接:GitHub - osrf/gazebo_models: Gazebo da…

简要理清计算机的发展(从硬件和软件)

1.计算机硬件和其他板块的关系 2.什么是计算机系统 可以简单理解计算机系统 硬件 软件。 3.硬件、软件的发展 3.1.硬件发展 逻辑元件的发展: 发展时间逻辑原件速度(次/秒)内存外存其他第一代1946-1957电子管几千-几万汞延迟线、磁鼓穿…

从源程序到可执行文件的四个过程

从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接,如下图所示: -E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执…

Flowable基础

简介 Flowable 是 BPMN 的一个基于 java 的软件实现,不过 Flowable 不仅仅包括 BPMN ,还有 DMN 决策表和 CMMN Case 管理引擎,并且有自己的用户管理、微服务 API 等一系列功能, 是一个服务平台。 官方手册: https://…

百万数据快速导入导出

百万数据快速导入 pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.0</version></dependency>Resourceprivate SalariesListener salariesListener;private ExecutorService…

01-微信小程序开发准备

文章目录 小程序的特点微信小程序开发小程序注册一些基础的设置查看日志开发设置&#xff08;AppID小程序ID&#xff09;服务器域名接口设置 开发者工具下载开发者工具安装开发者工具使用创建小程序 小程序的特点 小程序的特点 : ●小程序是一种不需要下载安装即可使用的应用,…

分享一个jquery重复绑定事件的问题

这篇文章主要分享一下前端在使用jQuery给元素绑定click事件时遇到的一点小问题。 今天在通过JS代码动态绑定元素的点击事件时遇到一点问题&#xff0c;如上图所示&#xff0c;需要实现动态控制低级内丹格子的解锁&#xff0c;每种宠物造型都有一个内丹数量。如图&#xff0c;忘…

快速学会MyBatis映射关系一对一

文章目录 映射关系一对一映射关系-官方文档映射关系1对1-基本介绍基本介绍注意细节 映射关系1 对1-映射方式映射方式配置Mapper.xml 的方式方式1方式2 注解的方式实现应用实例总结 映射关系一对一 映射关系-官方文档 文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.…

用C语言实现堆排序算法

1.设计思路 排序的思想将一个数组按递增的顺序进行排序&#xff0c;将数组的第一个位置空下&#xff08;下标为0&#xff09;&#xff0c;因为会导致子节点和本身同一个结点&#xff08;i和2i一致&#xff09;&#xff0c;每次堆排序在下标1的位置放上了最大值&#xff0c;然后…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/&#xff0c;下载对应CUDA版本的PyTorch【不能直接pip install&#xff0c;否则安装上的是CPU版本的】 2. 查看GPU信息 &#xff08;1&#xff09;重要信息 !nvidia-smi我的GPU版本很垃圾&#xff0c;本blog仅…

Qgis二次开发-加载本地离线瓦片地图

1.使用详情 准备离线瓦片地图数据&#xff1a;首先&#xff0c;需要获取离线瓦片地图数据。可以从一些开源地图提供商&#xff08;如OpenStreetMap&#xff09;下载地图切片数据&#xff0c;或者使用一些工具&#xff08;如MapTiler&#xff09;将自己的地图数据切片成瓦片格式…

【ChatGLM_01】ChatGLM2-6B本地安装与部署(大语言模型)

基于本地知识库的问答 1、简介&#xff08;1&#xff09;ChatGLM2-6B&#xff08;2&#xff09;LangChain&#xff08;3&#xff09;基于单一文档问答的实现原理&#xff08;4&#xff09;大规模语言模型系列技术&#xff1a;以GLM-130B为例&#xff08;5&#xff09;新建知识库…

分布式限流方案及实现

优质博文&#xff1a;IT-BLOG-CN 一、限流的作用和意义 限流是对高并发访问进行限制&#xff0c;限速的过程。通过限流来限制资源&#xff0c;可以提高系统的稳定性和可靠性&#xff0c;控制系统的负载&#xff0c;削峰填谷&#xff0c;保证服务质量。 服务限流后的常见处理…

CSS动画——实现波浪摇摆效果...

一、效果展示 以下主要实现四个动画&#xff1a; 元素上下摇摆动画波浪上下摇摆动画气泡上升及消失动画连续气泡右飘动画 二、实现思路 这里主要讲一下波浪上下摇摆动画和连续气泡右飘动画的实现思路 这里拿一张波浪图来举例解释实现波浪动画的思路&#xff1a; 波浪的摇…

14-测试分类

1.按照测试对象划分 ①界面测试 软件只是一种工具&#xff0c;软件与人的信息交流是通过界面来进行的&#xff0c;界面是软件与用户交流的最直接的一层&#xff0c;界面的设计决定了用户对设计的软件的第一印象。界面如同人的面孔&#xff0c;具有吸引用户的直接优势&#xf…

深入理解Gradle构建系统的工作原理

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

《被讨厌的勇气》勇敢的人先享受世界

《被讨厌的勇气》勇敢的人先享受世界 岸见一郎&#xff0c;古贺史健 著 &#xff08;岸见一郎&#xff1a;日本作家&#xff0c;心理学家&#xff0c;哲学家。致力于研究哲学和阿德勒心理学。&#xff09; 渠海霞 译 文章目录 《被讨厌的勇气》勇敢的人先享受世界[toc]第一夜 我…

iOS 应用上架流程详解

iOS 应用上架流程详解 欢迎来到我的博客&#xff0c;今天我将为大家分享 iOS 应用上架的详细流程。在这个数字化时代&#xff0c;移动应用已经成为了人们生活中不可或缺的一部分&#xff0c;而 iOS 平台的 App Store 则是开发者们发布应用的主要渠道之一。因此&#xff0c;了解…

从电容到晶体管的基本介绍

​随着科技的不断进步&#xff0c;元器件在现代电子学中扮演着至关重要的角色。从电容器到晶体管&#xff0c;各种元器件都具有不同的特性和用途。本文将从基础知识出发&#xff0c;介绍电子学中常见的元器件&#xff0c;以及它们在电路中的作用和应用。 电容器 电容器是一种…