重生学c++系列第三课类和对象(上)
好的我们重生c++系列的前两期已经介绍完了c++祖师爷针对C语言补充的几个新功能,现在我们进入c++的真正课题学习——类与对象:
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
比如说我们洗菜做饭,C语言关注的是 拿盆子 倒水 洗菜 放油 炒菜 等等等这些细致的步骤
一共有四个对象 :人 菜 锅 盘子 我们不需要关心菜是如何炒出来的
类的引入
//c++兼容C语言,C语言的用法可以接着用,也有新用法struct Stack
{
int* a;
int top;
int capacity;
};
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
struct Stack
{int* a;int top;int capacity;
};
int main()
{struct Stack st1;Stack st2;return 0;
}
主函数中两种建立类的方式不同,第一种是C语言的玩法,第二种是c++的玩法,明显要更简便一点
同时类中不仅仅可以定义成员变量,并且可以定义成员函数,比如说初始化之类的函数,就没必要在外边写了
上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
struct Stack
{//成员函数void Init(){a = nullptr;top = 0;capacity = 0;}//成员变量int* a;int top;int capacity;
};
int main()
{Stack st2;st2.Init();return 0;
}
这样调用Init初始化函数,是不是比C语言阶段在外部传参进去容易多了!
类的定义
class className{// 类体:由成员函数和成员变量组成}; // 一定要注意后面的分号
大家注意看,在将struc换成class之后,就无法访问我们在类中定义的函数了
这是因为我们没有加上访问限定符:publi private
c++的类是很任性的,我可以选择给你看给你用,也可以选择不给你看,不像struct随便访问,想给你看的加上publi(共有),不想给你看的就加上private(私有)
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Stack
{
public://成员函数void Init(){a = nullptr;top = 0;capacity = 0;}void Push(int x){if (top == capacity){size_t newcapacity = capacity == 0 ? 4 : capacity * 2;a = (int*)realloc(a,sizeof(int) * newcapacity);capacity = newcapacity;}a[top++] = x;}
private://成员变量int* a;int top;int capacity;
};
int main()
{Stack st2;st2.Init();st2.Push(1);st2.Push(2);st2.Push(3);st2.Push(4);return 0;
}
这样,我们在class中写的函数就可以用了,因为我们在他们的前面加上了public访问限定符
很多同学学到这里会有这样一个疑问,private限制类外访问,那限制类里的访问吗,答案是当然可以,就像是你家有一个保险柜,肯定用来防外人,自己家里人肯定知道密码的对吧。
成员变量的风格
我们定义一个新的日期的类
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){year = year;month = month;day = day;}
private:int year;int month;int day;
};
int main()
{Date d;d.Init(2022,7,13);return 0;
}
大家看这段代码,思考一下有没有初始化成功
答案:
编译是没有任何问题的,但是:

我们调试就会发现,这三个变量都是随机值,没有被初始化
这就是我们在C语言时期讲过的局部优先原则,忘了或者没听过的小伙伴去C语言的博客里就可以找到,所以我们只需要改一下成员变量
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Date d;d.Init(2022,7,13);return 0;
}
这样就可以啦,这就是成员变量的风格
封装
类的作用域
class date
{
public:void Printdate();
private:char _year;char _month;int _day;
};
// 这里需要指定Print是属于date这个类域
void date::Printdate()
{cout << _year << " "<< _month << " " << _day << endl;
} 类的实例化
想问大家一个问题,像下面代码这样可以访问吗?
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Data::_year;return 0;
}
答案是肯定不可以,所以接着问大家一个问题,private下边的三个变量,是声明还是定义
这是一个声明,不是定义,他们两个的区别就在于声明没有开空间,所以要定义变量,开空间来使用
类的大小模型
看代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;cout << sizeof(Date) << endl;cout << sizeof(d1) << endl;return 0;
}
大家猜猜这两个的内存大小分别是多少,一个是图纸,一个是根据图纸建造的房子
小tips:大家想想C语言期间学的结构体内存对齐
答案:

有这个结果可以知道,函数是没有存在类里的
大家想想,如果我们直接定义五个类变量,难道要生成五个函数用的空间吗,大家可以把函数想象成公用的,建立的那个类变量用的函数都是一个
类的大概存储模式

每一个成员变量都是不一一样的, 但是函数放在公共代码区
内存对齐规则
前边在C语言阶段其实我们说过内存对齐的规则,这里再给大家写一下:
大家一定要熟记这个规则并且会运算,这个面试的时候很有可能会用到的,这里小编给大家整理的几个面试上关于内存对齐的面试题:
如果有问题可以在评论区提出来
this指针
上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date
{
public:void Printf(){cout << _year << '/' << _month << '//' << _day << endl;}void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;return 0;
}
还是之前我们写的代码没有什么心意,但是大家看这一区域

我们在调用初始化函数的时候,使用的是我们在private中定义的三个变量吗?
答案:不是
我在之前说过,private里是声明,根本就没有开辟空间,并且在主函数部分我们开辟了两个变量,如果调用的是private里的变量,那么又是怎么一份变成两份的呢?所以我们根本没用这里的变量这就涉及到我们接下来要学的新知识点this指针。
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
这是我们刚刚写的初始化函数,里边传了三个参数年月日完成传参赋值,其实在这个函数里,含有一个我们看不见的隐藏参数,他真正的原型应该是这样的:
void Init(Date *this ,int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
对比一下,多了个this指针,加粗的部分都是编译器自己加的
函数主体多了个参数,在在主函数调用时编译器也是自动给我们加了东西
我们自己写的:
int main()
{
Date d1;
d1.Init(2023, 7, 23);
Date d2;
d2.Init(2013, 7, 23);
return 0;
}
实际上编译器底层编译的:
int main()
{
Date d1;
d1.Init(&d1,2023, 7, 23);
Date d2;
d2.Init(&d2,2013, 7, 23);
return 0;
}
可以说我们可以运行代码,使用变量和函数都多亏了this指针

有一点值得注意,this指针在形参和实参的位置并不能由我们自己显示的写出来,但是可以在类里边显示的用
如:
class Date
{
public:void Init(int year, int month, int day){this->_year = year;this->_month = month;this->_day = day;}void Printf(){cout << this->_year << '/' << this->_month << '//' << this->_day << endl;}
private:int _year;int _month;int _day;
};
像这样,但是我们不写编译器会自动给我们加,写了反而多此一举,大家了解一下就行
this指针的特性
this指针的存储
我们都知道电脑的内存分为栈,堆,常量区,静态区,那么this指针存在哪里呢,大家不妨猜一猜
this指针是一个形参,一般都存在栈区
好了关于类和对象(上篇)就写到这,大家敬请期待下一期内容!!!
相关文章:
重生学c++系列第三课类和对象(上)
好的我们重生c系列的前两期已经介绍完了c祖师爷针对C语言补充的几个新功能,现在我们进入c的真正课题学习——类与对象: C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 比如说我们洗菜做饭&am…...
驱动开发-按键中断
编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制LED亮灭 2.按键1 按下,led1电位反转 按键2按下,led2电位反转 按键3 按下,led3电位反转 功能函数 #include<stdlib.h> #inclu…...
数据结构 | 二叉树的应用
目录 一、解析树 二、树的遍历 一、解析树 我们可以用解析树来表示现实世界中像句子或数学表达式这样的构造。 我们可以将((73)*(5-2))这样的数学表达式表示成解析树。这是完全括号表达式,乘法的优先级高于加法和减法,但因为有括号,所以在…...
python:卡尔曼和贝叶斯滤波器
本文分享一个Filerpy的说明文档和代码示例文档,有关于 Python 中的卡尔曼和贝叶斯滤波器。该方法可以应用于气象遥感等领域。 说明文档:https://filterpy.readthedocs.io/en/latest/kalman/KalmanFilter.html 参考代码链接:https://nbviewer.…...
走进 Go 语言基础语法 | 青训营 (1)
Powered by:NEFU AB-IN 文章目录 走进 Go 语言基础语法 | 青训营 (1)代码注释代码模板 走进 Go 语言基础语法 | 青训营 (1) 代码注释 /** Author: NEFU AB-IN* Date: 2023-08-06 09:44:15* FilePath: \GoTest\a.go* LastEditTime: 2023-08-06 11:00:45*/ package mainimport (&…...
基于边缘无线协同感知的低功耗物联网LPIOT技术:赋能智慧园区方案以及数字工厂领域
回到2000年左右,物联网的底层技术支撑还是“ZigBee”,虽然当时ZigBee的终端功耗指标其实也并不庞大,但是,“拓扑复杂导致工程实施难度大”、“网络规模小导致的整体效率低下”都成为限制其发展的主要因素。 LPWAN,新一…...
【《快速构建AI应用——AWS无服务器AI应用实战》——基于云的解决方案快速完成人工智能项目的指南】
基于云的人工智能服务可以自动完成客户服务、数据分析和财务报告等领域的各种劳动密集型任务。其秘诀在于运用预先构建的工具,例如用于图像分析的Amazon Rekognition或用于自然语言处理的AWS Comprehend。这样,就无须创建昂贵的定制软件系统。 《快速构…...
vue运行在IE浏览器空白报错SCRIPT1006: 缺少‘)‘ -【vue兼容IE篇】
其他浏览器均正常,但是切换ie模式,打开空白,F12打开报错缺少‘)‘ ,如下图 在搜狗浏览器下点开报错:定格在crypto-js处 解决: 步骤一:使用npm安装babel-polyfill 依赖(已安装了可忽…...
接口自动化测试Mock Get和Post请求
Mock可以模拟一个http接口的后台响应,可以模拟request,response 下载 moco-runner-0.11.0-standalone.jar 下载链接: https://pan.baidu.com/s/1bmFzvJPRnDlQ-cmuJ_3iRg 提取码: kpjv 确保安装了jdk,cmd下可以运行java -version 一、模拟不带参的get请求…...
WPF上位机8——C#与MySQL
ADO.NET 数据库连接 数据插入、删除、更改 数据查询 带单个参数 带多个参数 using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Wp…...
[JAVAee]网络编程-套接字Socket
目录 基本概念 发送端与接收端 请求与响应 编辑客户端与服务器 Socket套接字 分类 数据报套接字 流套接字传输模型 UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 示例一: 示例二: TCP流数据报套接字编程 ServerSock…...
批量导出pdf为zip文件(可以修改zip中pdf名称)
核心代码 public static void compressZip1(HashMap<String,File> map, String rootPath, String zipFileName) throws FileNotFoundException {FileOutputStream fileOutputStream new FileOutputStream(zipFileName);ZipOutputStream zipOutputStream new ZipOutputS…...
[国家集训队] Tree II 题解报告
[国家集训队] Tree II 一道真板子题 就是练习LCT懒标记的题目 除了翻转标记以外还要维护乘法标记和加法标记 注意加法标记和乘法标记的维护!!! 加法标记 因为splay的区间大小不是固定的,所以我们要维护size,并且…...
【redis】docker搭建redis集群
docker搭建redis集群,超级简单方便。 # 1. 拉取redis. 目前我拉取最新的是7.0.12 docker pull redis # 2. 下载配置文件 wget https://raw.githubusercontent.com/redis/redis/7.0/redis.conf # 3. 移到对应目录 mkdir -p /opt/docker/redis mv redis.conf /opt/d…...
前端个人年度工作述职报告(二十篇)
前端个人年度工作述职报告篇1 尊敬的各位领导、各位同仁: 大家好!按照20__年度我公司就职人员工作评估的安排和要求,我认真剖析、总结了自己的工作情况,现将本人工作开展情况向各位领导、同仁做以汇报,有不妥之处,希…...
TypeScript 编译配置
TypeScript的编译配置: 对单独一个ts文件进行监听编译 可使用tsc demo.ts -w 如果想对所有ts文件进行监听编译,监听到变化就自己编译,可以直接创建一个tsconfig.json文件。内容空着也OK:{},执行 tsc 或 tsc -w 如果有…...
使用DMA传输实现单片机高效串口转发——以STM32系列为例
使用DMA传输实现单片机高效串口转发——以STM32系列为例 DateAuthorVersionNote2023.08.06Dog TaoV1.01. 完成了文档的撰写。 文章目录 使用DMA传输实现单片机高效串口转发——以STM32系列为例应用场景实现流程源码示例串口与中断配置DMA外设配置DMA发送数据函数串口中断服务函…...
一文了解 Android Auto 车载开发~
作者:牛蛙点点申请出战 背景 我的的产品作为一个海外音乐播放器,在车载场景听歌是一个很普遍的需求。在用户反馈中,也有很多用户提到希望能在车上播放音乐。同时车载音乐也可以作为提升用户消费时长一个抓手。 出海产品,主要服务…...
Pixel4 安卓源码及内核修改编译教程 | 基于Android12 AOSP
之前整理了 Pixel4上的源码过程,下载的话大家可以去镜像网站下载,可以节约很多时间。 实验设备:Ubuntu18.04 32G2T Pixel4 文章目录 一、安卓源码下载1.准备下载环境(1)安装Python 3.9(2)安装g…...
如何做好Code Review
本文主要从我们为什么需要CR?CR面临哪些挑战?CR的最佳实践几个方面分析,希望可以给读者一些参考。 为什么需要CR? 代码质量 定性来看,大家都认可Code Review(后文简称CR)能显著改善代码质量&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
