C++:类和对象(上篇)

目录:

一:面向对象和过程的介绍

二:类的引入

三:类的定义

四:类的访问限定符以及封装

五:类的作用域

六:类的实例化

七:类对象大小的计算

八:类成员函数的this指针


思维导图:

1:面向对象和过程的介绍

C语言是面向过程的一门语言。面向过程就是:把事情拆分成几个步骤(相当于拆分成一个个的方法和数据),然后按照一定的顺序执行。

C++:是对C的改进(C++兼容C),所以C++既面向过程也面向对象。面向对象:把事物抽象成对象的概念,先抽象出对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法。

比如说:洗衣机洗衣服

面向对象:先抽象出对象:人,脏衣服,洗衣液,洗衣机;之后让指定的对象按照自己的方法去执行

2:类的引入

学过C语言的老铁们,应该都知道,结构体只能定义变量,不能定义函数;而在C++,里面结构体不仅可以定义变量,还支持定义函数,(在C++,更频繁使用class这个关键字来定义类)

 以实现一个为列

c语言里面的结构体是不支持函数定义在里面的

对于C++就不一样了:

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

类体中的内容为类的成员,由2部分组成:成员函数(类的方法);成员变量(类的属性或者对象)

对于类的定义有两种方法

 3.1声明和定义全部在类体里面

3.2类的声明在.h文件,成员函数定义在.cpp文件

注意当成员函数定义在cpp文件里面的时候,需要用类的名字+域作用限定符(:)进行索命一下

3.3成员变量命名原则 

当我们初看此代码的时候,往往感到头大。到底 ‘ = ’的右边是形参还是成员变量捏???

 

这对代码的可读性的要求不就上来了吗。往往我们会对形参名字前面(后面)加一个下划线:当名字相同的时候 

 

4:类的访问限定符以及封装
4.1访问限定符

C++的访问限定符有3种: public(公有),private(私有),protect(受保护)

1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到  }  即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

 经典面试题:C++structclass的区别是什么?

权限不同:struct 默认权限是public,兼容C; class 默认权限是 private;在继承和模板参数列表位置,structclass也有区别; 

4.2封装

面向对象的封装有3个特点:封装,继承,多态

封装的本质就是为了更好的管理

C++ 语言中实现封装,可以 通过类将数据以及操作数据的方法进行有机结合,通过访问权限来 隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用
5:类的作用域

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

 

6:类的实例化

一个类是对对象的一种描述,他限定了一个对象的成员属性;可以把类理解成一个模型,只是对对象的一种形象化的描述,但在创建类的成员的时候并没有对对象进行初始化(申请内存)

 

 创建了一个Date的类,但是并没有对Date这个所有的成员进行初始化

当前创建了一个time1这样的一个Date类,同时系统也为time1进行内存的分配

7:类对象大小的计算

 

结构体内存对齐规则:

1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
   注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
   VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,
   结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

 

综上我们可以看出:一个类所占字节的大小实际上就是该类中所有变量的大小(注意结构体的对齐规则)

空类或者是只有成员函数的类,比较特殊,只占一个字节,用来表示类的对象

8:类成员函数的this指针

 1. 成员函数中,不能给this指针赋值。
2. 只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

灵魂拷问的面试题:

1:this指针存放在哪一个区域

this指针存放在栈区的(注意不是存放在对象里面的)

2:可不可以对this指针进行赋值 

不能对this指针赋值

 分析以下程序运行的结果:

1)

有不少人可能认为程序会崩溃:p->Init( ……)这不出现了空指针的访问

注意:看到 -> 不一定就是对指针的解引用,在这里就不是对成员函数的解引用,注意Init( ……)这个函数是存放在公共代码区域的,所以这里并不会出现空指针访问的问题

2)

此时程序崩溃:原因就是对空指针出现了访问

 结语:

以上就是我今日要为大家share的内容,关于类和对象这个知识模块,比较抽象,需要多多练习,结合理解,希望大家看到此篇博客可以有所收获

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

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

相关文章

【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

目录 01.预处理(宏替换) 02.编译(生成汇编) 03.汇编(生成机器可识别码) 04.连接(生成可执行文件或库文件) 05.选项 编译器在编译代码时包含以下四个步骤:1.预处理 2…

商品规格存储问题

准备条件 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version> <!-- 指定您需要的 FastJSON 版本 --></dependency>Testvoid test6() {// 创建 JSON 对象JSONObjec…

MongoDB启动报错

spring boot 引入MongoDB启动报错 java.lang.IllegalStateException: Failed to introspect Class [io.micrometer.core.instrument.binder.mongodb.DefaultMongoConnectionPoolTagsProvider] from ClassLoader [sun.misc.Launcher$AppClassLoader18b4aac2] at org.springfra…

爬虫综合案例-获取房源信息并在地图上显示

文章目录 1.项目介绍2.项目分析3.爬取房源信息4. 导入高德地图5.地图上显示房源信息6.运行程序 1.项目介绍 本次案例将从 58 同城信息网爬取相关城市的房源出租信息&#xff0c;然后通过高德地图把房源信息地图显示&#xff0c;通过地图进行浏览&#xff0c;点击相应的热点文字…

二叉树|二叉树的层序遍历 (广度优先搜索)

力扣题目链接 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que;if (root ! NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size que.size();vector<int>…

网络工程师练习题3

网络工程师 在Cisco Catalyst 3548以太网交换机上建立一个名为lib105的VLAN&#xff0c;下列正确的配置是&#xff08;&#xff09;。 A.Switch-3 548#vlan 1 name lib 105 Switch-3548#exitB.Switch-3548&#xff08;valn&#xff09; 1 name lib 105C. Switch-3548&#xf…

[运维] 可视化爬虫易采集-EasySpider(笔记)

一、下载 ​下载地址 下滑到Assets页面&#xff0c;选择下载 二、解压运 ​解压压缩包&#xff0c;打开文件夹 在此文件夹下打开Linux Terimal, 并输入以下命令运行软件&#xff1a; ./easy-spider.sh 注意软件运行过程中不要关闭terminal。 三、使用 1.开始 首先点击…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

愚人节礼物(C++)

这不愚人节 快到了吗&#xff1f;身为顶级程序员&#xff0c;不用c编写愚人节礼物那心里是很不舒服的&#xff0c;所以&#xff0c;趁着愚人节到来之际&#xff0c;下面分享一种坑朋友的c代码&#xff1a; 内容包含一些敏感词&#xff0c;如果对你产生了影响或伤害&#xff0c;…

IDEA 配置阿里规范检测

IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中&#xff0c;右键 然后会给出一些不符合规范的修改建议&#xff1a; 保存代码时自动格式化代码 安装插件&#xff1a; 配置插件&#xff1a;

SPSS k-均值聚类的 anova分析表解读

from&#xff1a;SPSS K均值聚类&#xff08;k-means&#xff09;和可视化方法 - CollinsLi - 博客园 (cnblogs.com) F值&#xff1a;变量对聚类的贡献 显著性水平&#xff1a;<0.05 则因子显著

MyBatis面试简答题

以下是一份MyBatis的高难度简答题,共20题: 请解释MyBatis中#{}和${}的区别,并举例说明它们在实际应用中的使用场景。 MyBatis的Mapper接口是如何与XML映射文件关联的? 如何在MyBatis中实现动态SQL?请列举几种常见的动态SQL元素并解释其作用。 描述MyBatis中的ResultMap的作…

[python] ETL 工作流程 Prefect

Prefect 是一个用于构建、调度和监控数据流程的 Python 库。它提供了一种简单而强大的方式来管理 ETL&#xff08;Extract, Transform, Load&#xff09;工作流程。下面是一个简单的示例&#xff0c;演示了如何使用 Prefect 来创建和运行一个简单的任务&#xff1a; 首先&…

深入理解JavaScript对象类型及其用法

在JavaScript中&#xff0c;对象是一种复合数据类型&#xff0c;用于存储多个值作为属性。这些属性可以是原始数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;也可以是其他对象。JavaScript对象的灵活性和强大功能使其成为编程中的关键概念。本文将深入探讨Java…

Pug 模板引擎:学习与使用

Pug 模板引擎&#xff1a;学习与使用 在前端开发中&#xff0c;模板引擎的使用可以极大地提高代码的可读性和可维护性。Pug&#xff08;也称为 Jade&#xff09;是一个流行的 Node.js 模板引擎&#xff0c;它使用简洁的语法来创建 HTML 结构。由于在vue3文档中看到了Pug的影子…

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比 —— 杭州 2024-03-19 夜 code review! 文章目录 CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比1.三者区别2.具体示例说明3.CMAKE_SOURCE_DIR 和 PROJECT_S…

Sora没体验资格?开源项目:Open-Sora,复现类Sora视频生成方案

项目简介 Open-Sora项目是一项高效制作高质量视频的工作&#xff0c;明确所有权使用其模型、工具和内容的计划。通过采用开源原则&#xff0c;Open-Sora 不仅实现了先进的视频生成技术的普及&#xff0c;还提供了一个专业且用户界面的方案&#xff0c;简化了视频制作的复杂性。…

php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Pangle后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://www.pangleglobal.com/zh/integration/reporting-api-v2 在这里插入图片…

算法---二分查找练习-2(寻找旋转排序数组中的最小值)

寻找旋转排序数组中的最小值 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;检查数组的最后一个元素是否大于第一个元素。如果是&#xff0c;说明数组没有进行旋转&#xff0c;直接返回第一个元素作为最小值…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …