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

chatgpt/2023/9/24 0:31:54

目录

一、类的概念

二、类的引入

三、类的定义 

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.exyb.cn/news/show-5313673.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合SSMP小demo

创建项目 spring web,mybatis,mysql勾选 加入mp和druid,依赖见SpringBoot基础认识_阳光明媚UPUP的博客-CSDN博客 yml数据源 server:port: 81 spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:m…

Linux系统下U盘打不开: No application is registered as handling this file

简述 系统是之前就安装好使用的Ubuntu14.04,不过由于某些原因只安装到了机械硬盘中;最近新买了一块固态硬盘,所以打算把Ubuntu系统迁移到新的固态硬盘上; 当成功的迁移了系统之后发现其引导有点问题,导致多个系统启动不…

链表刷题常用技巧——快慢指针

强大,不动如山的强大,不会输给自己的真正的强大。 往期回顾: 数据结构——单链表 单链表力扣刷题 文章目录 经典例题:链表的中间结点 题目分析及双指针思路引入 双指针图解 leetcode 核心代码 判断环形链表——快慢指针…

Linux嵌入式平台安全启动理解介绍

一、意义 安全启动可以防止未授权的或是进行恶意篡改的软件在系统上运行,是系统安全的保护石,每一级的前一个镜像会对该镜像进行校验。 1.1 安全启动原理介绍 通过数字签名进行镜像完整性验证(使用到非对称加密算法和哈希算法) 签名过程: raw_image--->use ha…

数据结构:复习笔记

目录 前言1. 数据结构绪论1.1 数据结构的概念及分类1.1.1 知识点提要1.1.2 选择判断与简答归纳1.1.3 算法编程题 1.2 算法设计与算法分析1.2.1 知识点提要1.2.2 选择判断与简答归纳1.2.3 算法编程题 2. 线性表2.1 线性表的概念2.1.1 知识点提要2.1.2 选择判断与简答归纳2.1.3 算…

安装win版本的neo4j(2023最新版本)

安装win版本的neo4j 写在最前面安装 win版本的neo4j1. 安装JDK2.下载配置环境变量(也可选择直接点击快捷方式,就可以不用配环境了)3. 启动neo4j 测试代码遇到的问题及解决(每次环境都太离谱了,各种问题)连接…

服务器远程不上服务器怎么办?服务器无法远程的原因是什么?

服务器远程不上服务器怎么办?服务器无法远程的原因是什么? 接下来跟着笔者一起分析一下具体的原因有哪些以及相对应的解决方法 一、网络问题 1.本地网络问题 解决办法:检查本地网络是否正常,访问外网是否流畅,可以…

辅助栈、单调栈与单调队列在lc中的应用

为什么要汇总在一块? 三者都有何区别? 总结 1 泛化性更好的策略 个人建议单调栈/队列中存放的元素最好是下标而不是值,因为有的题目需要根据下标计算,这样泛化性更好。参考lc239和lc496 2 单调队列何栈其实可以共用同一套模板…
推荐文章