c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
绪论
上一章,我们将c++入门的基础知识进行了学习,本章其实才算真正的跨入到c++开始可能比较难,但只有我们唯有不断的前进,才能斩断荆棘越过人生的坎坷!
话不多说安全带系好,发车啦(建议电脑观看)。
附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要
思维导图:
要XMind思维导图的话可以私信哈
目录
1.面向过程和面向对象的认识
2.类的引入
3.类的定义(class)
3.1类的访问限定符
4.封装
5.类的实例化
6.类对象模型
6.1计算类对象的大小
7.this指针
1.面向过程和面向对象的认识
面向过程、面向对象的概念:
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题;而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。(过程就是完成一个事所要实现的步骤,而面向对象则是面向人,人们需要什么需求)
2.类的引入
知识点:
在c++中将struct升级成了类,此时不同于C语言,我们可以在结构体中定义函数
细节(具体):
- 如此时,在数据结构中实现功能的函数都是分开来写的,而在c++中因为struct升级成了类,类就可以把其中要实现的函数功能直接放在结构体中。
练习:
写一个类来实现栈的基本结构:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdlib.h>
#include<assert.h>using namespace std;struct Stack
{//成员函数//在类域中不管声明的位置都能找得到void Init(int DefaultCapacity = 4){a = (int*)malloc(sizeof(int) * DefaultCapacity);if (a == nullptr){perror("malloc");return;}capacity = DefaultCapacity;size = 0;}void Push(int x){ if (size == capacity){int* ptr = (int*)realloc(a, sizeof(int) * capacity * 2);assert(ptr);a = ptr;capacity *= 2;} a[size++] = x;}int Top(){assert(size);return a[size - 1];}// .... 就不过多的写了,此处了解语法即可void Destroy(){free(a);a = nullptr;capacity = size = 0;}//成员变量int* a;int size;int capacity;
};int main()
{Stack sk;sk.Init(20);sk.Push(1);sk.Push(2);sk.Push(3);cout << sk.Top() << endl;//栈顶元素3sk.Destroy();return 0;
}
3.类的定义(class)
知识点:
- 基本语法和struct一样,只是换了个名称;class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略,类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数
- 语法:
class classname
{
//类体 ,有成员函数和成员变量组成
}; // 和结构体一样也要符号
3.1类的访问限定符
访问限定符:
publish(公有) 、 private (私有) 、 protect (保护)
1.public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
使用类定义时的细节:
- 成员函数的声明和定义全部放在类体时需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理,默认类里的成员函数是内联函数
- 类声明放在.h文件中,成员函数定义放在.cpp文件中时(分源管理):成员函数名前需要加类名::(因为在该函数中的name,sex,age 需要来源而来源就是类 , 来确定他是一个类里的成员函数的定义)
附:一般可以在成员变量的前/后/最前main加上m加上 _ , 来区分局部变量和成员变量
4.封装
知识点:
面向对象的三大特性:封装、继承、多态
封装定义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互(本质封装是为了可以更好的管理)
封装的实例描述:
通过C语言和c++的角度来解释:
在c中我们结构体的成员变量不像c++中的成员变量一样可以进行私密(private),这样就会导致我们可以直接访问到结构体中的数据,而c++中对其进行了私密工作,我们无法在类外进行访问。
5.类的实例化
知识点:
用类类型创建对象(变量)的过程,称为类的实例化(当我们创建了一个类后,其中的成员变量其实并没有创建其只是一个声明,并没有实际的空间)。
所以说类的实例化就是把变量开辟一个空间,方法也很简单:就是用这个类创建一个变量即可。
实际举例如:
我们前面写的
此处就是一个实例化的例子,此后sk内的size capacity就实例化了 (也可以用实际的例子来解释:类就是一个图纸, 而我们用这个图纸来建造一个真正的房子这个房子就是这个类(图纸)的实例化 )
6.类对象模型
6.1计算类对象的大小
知识点:
在对象中只算成员变量的大小(和算结构体的方法一致同样也需要去内存对齐),成员函数是不算在其sizeof大小内的(因为成员函数其实并没有放到对象内而是放到了一个公共的区域,他就像一个小区里的篮球场并不需要每家都有,而是在一个公共的地方)
如果对结构体内存对齐有所忘记的同学可以去看一下这篇blog
细节:
- 对于类的大小,当是一个空类(没有成员变量的类对象)时是一个比较特殊的情况,此时编译器会给空类一个字节(为了占位表示其是存在的)
7.this指针
知识点:
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数(这个指针就是this),让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成(可以通过例子来更加深刻的认识this指针)
细节:
- this不能在形参或实参中显示使用,但是可以在函数内部显示使用
- this 指针的类型是:类 * const this
- this指针存在栈上(并不在对象中,因为其是一个形参就会存在函数调用的栈帧内)
- 在vs环境下,this指针会放到ecx寄存器中传参
通过实例来了解this指针:
//写一个日期类的类
class Date
{
public:void Init(int year = 1970, int month = 1, int day = 1){_day = day;_month = month;_year = year;}void Print(){cout << _year << ' ' << _month << ' ' << _day << endl;}
private:int _day;int _month;int _year;
};int main()
{Date d1;Date d2;d1.Init(2004, 9, 7);d2.Init(2003, 7, 7);d1.Print();d2.Print();return 0;
}
向上面这种情况为什么Print()函数中并没有传参数但是却能正确的找到对象,并且对对象中的数据进行打印呢、并且虽然前面有的d1. d2. 但这又能代表什么呢?
这其实就是隐含的this指针的作用,通俗来说就是当我们在前面确定了对象后,操作系统就会帮我们自动实现某种操作(其实也就是传对象的地址,并且有个this指针接收这个传进来的参数)
如:我们可以把 d1.Print ( );看成 d1 Print ( &d1 )
并且在函数内可以看成void Print(Date *const this)
{
cout <<this -> _year << ' ' <<this -> _month << ' ' <<this -> _day << endl;
}
其实和我们写数据结构中的一些结构很像,只是c++编译器中的类做了一些简化。
本章完。预知后事如何,暂听下回分解。
持续更新大量C++细致内容,希望对你有所帮助!早关注不迷路!
相关文章:

c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
绪论 上一章,我们将c入门的基础知识进行了学习,本章其实才算真正的跨入到c开始可能比较难,但只有我们唯有不断的前进,才能斩断荆棘越过人生的坎坷! 话不多说安全带系好,发车啦(建议电脑观看&…...

关于Open Shift(OKD) 中应用管理部署的一些笔记
写在前面 因为参加考试,会陆续分享一些 OpenShift 的笔记博文内容为介绍 openshift 不同的创建应用的方式,包括: 基于 IS 创建应用基于镜像创建应用基于源码和 image 创建应用基于源码和 IS 创建应用基于模板创建应用 学习环境为 openshift v…...

【linux】对于权限的理解
权限 Linux权限的概念用户之间的切换 Linux权限管理文件权限操作文件的人Linux文件默认权限的设置权限掩码 所属组/其他删除拥有者创建的文件文件拥有者、所属组的修改修改文件拥有者修改文件所属组一次性修改拥有者和所属组 目录的执行权限 Linux权限的概念 首先,…...

测试人必备技能:如何进行WebSocket接口测试?
目录 前言 WebSocket介绍 HTTP与WebSocket的区别 二者关系 WebSocket测试方法 使用Postman 使用Jmeter 使用Python 结语 前言 随着Web应用的日益普及,WebSocket作为一种全双工通信协议,在移动端、游戏、视频会议等方面得到广泛应用。 而对于需…...

【Android FrameWork (三)】- SystemServer
文章目录 知识回顾启动第一个流程initZygote的流程 前言源码分析1.system_server2.SystemServer.main3,startBootstrapServices4,startService 拓展知识LoadApkcontext 对于Android context 大家是怎么理解的?LocalServices.java: addServece方法中 ArrayMap和HashM…...

Docker容器部署及基本使用
文章目录 一、环境初始化配置二、安装Docker三、优化配置四、基础命令 一、环境初始化配置 1、关闭防火墙 systemctl stop firewalld systemctl disable firewalldsetenforce 0sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config sed -i s/SELINUXenforcing/S…...

【机智云物联网低功耗转接板】+模拟MCU快速上手
GE211是机智云自研的定制化转接板,使用 ESP32-C3-WROOM-02 通讯模块,适用于白色智能家电等设备应用。 转接板已经烧录了机智云连云的最新GAgent固件,所以不需要烧写任何软件就可以快速上手使用。 GE211板卡带有一个串口,一般是把这…...

ai免费写作在线平台-ai免费伪原创文章生成器软件
ai伪原创能检测出来吗 人工智能技术可以检测伪原创,但是不是所有的伪原创都可以被检测出来。 现在有许多自然语言处理(NLP)算法和技术可以用来检测伪原创内容,例如文本相似度比较算法,语气分析算法等。这些算法可以检…...

Web自动化测试简介及web自动化测试实战交教程
一、认识web自动化测试 1.什么是自动化测试? 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段,按照测试人员的预定计划对软件产品进行自动化测试,他是软件测试的一个重要组成部分,能够完成许多手工测试无法完成或…...

基于单片机的家庭应急电源设计
基于单片机的家庭应急电源 摘 要 本设计基于STC89C52单片机设计得应急电源,以应急电源为研究对象,单片机设计为控制集成IC,ADC为模数转换控制模块,无源蜂鸣器作为报警电路。系统分为单片机设计最小系统,AD转换控制模…...

线程七大状态
线程生命周期(七大状态) 新建状态(New):当Java线程被创建时,它处于新建状态。此时,线程对象已被创建,但尚未启动。在这个状态下,线程并没有开始执行任何代码,…...

Linux第一章
文章目录 前言一、操作系统概述二、Linux初识1.Linux系统的诞生2.Linux系统内核3.Linux发行版 三、虚拟机介绍四、安装vmware workStation1.VMware WorStation软件2.安装 五、vm安装linux六、远程连接Linux系统1.图形化、命令行2.为什么使用命令行操作linux3.使用FinalShell软件…...

Microsoft Defender for Identity部署方案
目录 前言 一、重要组件 二、部署步骤 1、准备 Azure 订阅 2、配置 Microsoft Defender for Identity 门户...

超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!
众所周知,实时目标检测( Real-Time Object Detection )一直由 YOLO 系列模型主导。 飞桨在去年 3 月份推出了高精度通用目标检测模型 PP-YOLOE ,同年在 PP-YOLOE 的基础上提出了 PP-YOLOE 。后者在训练收敛速度、下游任务泛化能力以及高性能部署能力…...

基于Docker安装Redis【保姆级教程、内含图解】
Redis官网:Redis Redis中文官网:CRUG网站 两者选其一即可,建议使用 Redis官网:Redis 学习任何框架和技术,一定要参考相应的官网学习,一定要参考官网学习!!! 目录 一、拉取…...

电子表格软件与一站式BI的区别
看完本节内容,相信您能够了解到电子表格软件(代号电子表格软件)与「一站式 BI」的主要区别。所谓一站式BI在官网上的名称就是Smartbi V10.5,代号就是Smartbi一直在使用insight。 这两个产品都属于商业智能BI软件的品类࿰…...

SpringCache
一、介绍 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。 Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就…...

Android Framework—Service
介绍 Service是一种可以在后台执行长时间运行操作而不提供界面的应用组件。服务可以由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可以通过绑定到服务与之进行交互,甚至是执行进程之间的通信…...

leetcode (重排数组使得)连续子数组的权值和最小
题目描述:请重新排列某个仅包含2和3的数组,使得数组的所有连续子数组权值之和最小数组的权值定义为,数组中所有元素之积的因子个数,例如:rank([2,3])4 x p 1 c 1 p 2 c 2 p 3 c 3 ⋅ ⋅ ⋅ p k c k r a n k ( c 1 1 ) ( c …...

JSP计算机等级考试查询系统(源代码+论文+答辩PPT)
第一章 引言 计算机等级考试查询系统是有其开发的必要性的,它的应用将大大节省了学校的人力资源,从而从人工劳动中解脱出来。我们这次开发的软件系统一共包括了三个部分:等级考试的报名系统、查询系统和管理系统。其中管理系统是另外两部分…...

python 基础系列篇:七、以函数方式编写一个数字华容道
python 基础系列篇:七、以函数方式编写一个数字华容道 数字华容道游戏分析开始编写完整代码代码解说定义方法的规律 小结 数字华容道 嗯,就是一个简单的益智游戏,把数字按照特定规律排列,并比矩阵少一个格,用来进行移…...

2023年前端面试题
1.position都有哪些属性 2.1px等于多少rem,rem根据根元素的大小,根元素是谁 3.Es6操作数组的方法 4.防抖和节流以及应用场景 5.Vue和ajax最大的区别是什么(Vue和ajax怎么操作dom的,vue虚拟dom) 6.js数据类型有哪些&…...

快速入门量化交易
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 原作者:袁霄|慕课网讲师 近来“量化交易”这个词听得越来越频繁,多数人对量化交易的第一印象是“高大上的技术”…...

Mongodb oplog
在MongoDB复制集中,oplog信息存储在oplog.rs集合中。 oplog.rs集合是一个固定大小的集合(capped collection),它位于local数据库中。 当我们在源MongoDB实例上启用了复制(replication)功能,MongoDB会自动在local数据库中创建oplog.rs集合。此后,所有在该实例上的写操作都会生…...

python基础篇: python字符串方法都有哪些?你知道多少?
❝ Python提供了丰富的字符串处理方法,可以方便地对字符串进行操作、处理和转换。在本文中,我们将介绍Python中常用的字符串方法。 ❞ python中字符串内置方法很多,可以通过dir()方式查看具体有哪些方法,下表是python字符串的全部…...

chmod 命令 (chmod 0660)
chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…...

Qt应用开发常用功能
Qt判断当前操作系统? #ifdef Q_OS_MAC //mac ... #endif#ifdef Q_OS_LINUX //linux ... #endif#ifdef Q_OS_WIN32 //win ... #endif#ifdef __arm__ //arm ... #endifQt实现应用程序关闭和重启? //关机按钮-点击槽函数 void SystemD::on_shutdownButton…...

麻了,部门新来的00后给我卷崩溃了...
今天上班开早会就是新人见面仪式,听说来了个很厉害的大佬,年纪还不大,是上家公司离职过来的,薪资已经达到中高等水平,很多人都好奇不已,能拿到这个薪资应该人不简单,果然,自我介绍的…...

代码随想录算法训练营第56天|583. 两个字符串的删除操作,72. 编辑距离
代码随想录算法训练营第56天|583. 两个字符串的删除操作,72. 编辑距离 583. 两个字符串的删除操作72. 编辑距离 583. 两个字符串的删除操作 题目链接:583. 两个字符串的删除操作,难度:中等 【实现代码】 class Solution { publi…...

【嵌入式笔/面试】嵌入式软件基础题和真题总结——操作系统
在学习的时候找到几个十分好的工程和个人博客,先码一下,内容都摘自其中,有些重难点做了补充! 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…...