全面且深度学习c++类和对象(上)
文章目录
- 过程和对象
- 类的引入,
- 类的定义
- 类的访问限定符及封装
- 类的访问限定符
- 封装
- 类的实例化
- 类大小
- 内存对齐规则:
- this指针
- this特性
过程和对象
C语言面向过程设计,c++面向对象设计,
举例:洗衣服
C语言:放衣服,放洗衣粉,启动洗衣机,脱水,拿出来晾干。
而c++关注对象,一共四个对象,人,衣服,洗衣粉,洗衣机。
这个过程是4个对象交互完成的,人不需要关注洗衣机如何工作洗衣服的,
类的引入,
C语言中结构体中只能定义变量,c++中可以定义变量和函数,如C语言实现的栈只能定义变量,而c++代码如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int DateType;
struct pll {void StackInit(int capacity = 4){_a = (DateType*)malloc(sizeof(DateType) * capacity);if (_a == NULL){perror("malloc fail");return;}_capacity = capacity;_size = 0;}void StackPush(int x){if (_size == _capacity){DateType* tmp = (DateType*)realloc(_a,sizeof(DateType) * _capacity * 2);if (tmp == NULL){perror("fail realloc");return;}_a = tmp;_capacity *= 2;}_a[_size++] = x;}int Top(){return _a[_size-1];}void Destroy(){if(_a)free(_a);_a = nullptr;_capacity = 0;_size = 0;}DateType* _a;int _capacity;int _size;
};
int main()
{pll st;st.StackInit();st.StackPush(2);st.StackPush(5);st.StackPush(6);st.StackPush(7);st.StackPush(4);cout << st.Top() << endl;st.Destroy();return 0;
}
4
注意,c++结构体中,定义的变量无先后顺序,无需注意定义变量的位置,所以结尾定义的_capacity等,开头的函数也能用。
🚩 并且在c++中,我们用class来代替struct
类的定义
class stu
{
public:void test(int age=4){_age=age;cout << _sex << _age << endl;}
public:char _sex;int _age;
private:string _birthday;
};
为了防止类中函数参数也有sex,age这种,我们类中定义变量都是前面加_,方便与函数参数区分。
类的访问限定符及封装
类的访问限定符
🚩 c++实现封装的方式:用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部用户使用。
访问限定符说明:
1, public在类外可以被直接访问。
2, protected和private在类外不能被直接访问。
3,访问权限从类的访问限定符出现位置开始,持续到下一个类的访问限定符的出现,
4,如果后面没有类的访问限定符就持续 }即类的结束,
5, class的默认访问权限是private,struct默认访问权限是public(因为要兼容c语言)。
class和struct区别?
:c++兼容C语言,所以struct和class都可以定义结构体,还可以都定义类,区别是class默认访问权限private,struct访问权限public。
封装
在类和对象阶段,主要研究类和对象的封装,那么什么是封装?
🚩封装:通过类的方式将数据和操作数据结合起来,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,
封装本质上是一种管理,方便用户更容易操作类。例如电脑对外公开键盘,鼠标,显示屏,方便用户操作,但计算机真正工作是cpu,显卡,内存等硬件。
在c++,通过类对数据和操作数据有机结合起来,通过访问限定符隐藏对象内部实现细节,决定是否对外公开接口。
类的实例化
#include <iostream>
#include <string>
using namespace std;
class stu
{
public:void test(){cout << _sex << _age << endl;}
public:char _sex;int _age;
private:string _birthday;
};
int main()
{stu st;return 0;
}
和结构体用法一样,用类创建实例对象就叫类实例化,一个类可以有多个实例化对象。
创建出的类就相当于建房子的一张图纸,没有分配实际的物理空间,创建实例对象的过程,就是拿着图纸建房子,分配了实际物理内存空间,。
类大小
#include <iostream>
using namespace std;
class cs1
{
public:void test1(){int a;}
};
class cs2
{
public:void test2();
private: long long a;int b;char c;
};
class cs3
{};
int main()
{cout << sizeof(cs1) << endl;cout << sizeof(cs2) << endl;cout << sizeof(cs3) << endl;return 0;
}
1
16
1
类大小计算,里面函数不占字节,函数放在公共代码区只保存一次,多个实例化对象只需要保存各自的成员变量,成员变量需要内存对齐
编译器给空类一个字节,方便辨识
内存对齐规则:
1,第一个成员在结构体偏移量0位置处。
2,接下来的成员变量大小对齐在对齐数的整数倍地址,总大小是对齐数的整数倍
3,对齐数:编译器默认大小 和 该类最大类型的大小,vs默认8
这里该类对齐数8,因为long long字节占8,排0-7,int从8开始排8-11,char12,总共13字节,但补充13-15,总共16字节
4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
this指针
#include <stdio.h>
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;d1.Init(2020,2,12);Date d2;d2.Init(2021, 3, 14);return 0;
}
我们面临一个问题,d1,d2初始化时怎么确定是哪个_year,
所以引入了this指针:c++给每个非静态函数引入了this指针,this指向当前运行函数,函数内对成员变量的操作都是通过this指针访问完成的。只不过所有操作对用户是透明的,即用户不需要传递,编译器自动完成了。
this特性
1,this类型 *const,即不能改变 this指向,
2,this指针只能在自己本身函数使用
3,this指针是成员函数形参,函数调用将实参传给形参,所以类中不存储this
4,this指针是隐藏的指针,编译器通过ecx寄存器自动传递,不需要用户动手
相关文章:

全面且深度学习c++类和对象(上)
文章目录 过程和对象类的引入,类的定义类的访问限定符及封装类的访问限定符封装 类的实例化类大小内存对齐规则: this指针this特性 过程和对象 C语言面向过程设计,c面向对象设计, 举例:洗衣服 C语言:放衣服…...

开源情报如何成为信息攻防的关键资源
相比于传统情报,开源情报具有情报数量大、情报质量好、情报成本低、情报可用性强等优势。这是开源情报能够成为信息攻防关键资源的主要原因。 海量信息让开源情报具有更大潜力。一是开源情报体量巨大。信息化时代是信息爆炸的时代,网络上发布的各种信息…...

【风控】用户特征画像体系
一、体系架构概述 1.1 核心价值定位 风控特征画像体系是通过多维度数据融合分析,构建客户风险全景视图的智能化工具。其核心价值体现在: 全周期覆盖:贯穿客户生命周期的营销、贷前、贷中、贷后四大场景立体化刻画:整合基础数据…...
Android开发-文本输入
在Android应用开发中,文本输入是用户与应用交互的最常见方式之一。无论是登录界面、搜索框还是表单填写,都需要处理用户的文本输入。本文将介绍如何在Android应用中实现和管理文本输入,包括基本控件的使用、事件监听、输入验证以及一些高级功…...

Unity:场景管理系统 —— SceneManagement 模块
目录 🎬 什么是 Scene(场景)? Unity 项目中的 Scene 通常负责什么? 🌍 一个 Scene 包含哪些元素? Scene 的切换与管理 📁 如何创建与管理 Scenes? 什么是Scene Man…...
elementUI源码学习
学习笔记。 最近在看element的table表格优化,又去看了一下element源码框架。element 的架构是很优秀,通过大量的脚本实现工程化,让组件库的开发者专注于事情本身,比如新加组件,一键生成组件所有文件,并完成…...

SZU 编译原理
总结自 深圳大学《编译原理》课程所学相关知识。 文章目录 文法语法分析自顶向下的语法分析递归下降分析LL(1) 预测分析法FIRST 集合FOLLOW 集合 文法 乔姆斯基形式语言理论: 表达能力:0型文法 > 1型文法 > 2型文法 > 3型文法。 0 型文法&am…...
实时技术方案对比:SSE vs WebSocket vs Long Polling
早期网站仅展示静态内容,而如今我们更期望:实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢?三大经典技术各显神通: SSE(Server-Sent Events):轻量级单向数据流WebSocket:双向全双工通信Long Polling(长轮询):传统过渡方案假设目前有三…...

【程序员AI入门:模型】19.开源模型工程化全攻略:从选型部署到高效集成,LangChain与One-API双剑合璧
一、模型选型与验证:精准匹配业务需求 (一)多维度评估体系 通过量化指标权重实现科学选型,示例代码计算模型综合得分: # 评估指标权重与模型得分 requirements {"accuracy": 0.4, "latency": …...
北斗导航 | 基于深度学习的卫星导航数据训练——检测识别故障卫星
深度学习+故障卫星识别 **1. 数据准备与预处理****2. 模型选择与设计****3. 训练策略****4. 模型优化与验证****5. 实时部署与集成****6. 持续学习与更新****示例模型架构(LSTM + Attention)****挑战与解决方案**🥦🥦🥦🥦🥦🥦🥦🥕🥦🥦🥦🥦🥦🥦�…...

ARM Cortex-M3内核详解
目录 一、ARM Cortex-M3内核基本介绍 (一)基本介绍 (二)主要组成部分 (三)调试系统 二、ARM Cortex-M3内核的内核架构 三、ARM Cortex-M3内核的寄存器 四、ARM Cortex-M3内核的存储结构 五、ARM Co…...
基于Unity的简单2D游戏开发
基于Unity的简单2D游戏开发 摘要 本文围绕基于Unity的简单2D游戏开发进行深入探讨,旨在分析其开发过程中的技术架构与实现策略。通过文献综述与市场分析,研究发现,近年来Unity引擎因其优秀的跨平台特性及可视化编程理念,成为2D游戏开发的主要工具。文章首先梳理了游戏开发的…...
Linux系统编程——exec族函数
我们来完整、系统、通俗地讲解 Linux 系统编程中非常重要的一类函数:exec 族函数(也叫 exec family)。 一、什么是 exec? exec 系列函数的作用是: 用一个新的程序,替换当前进程的内容。 也就是说…...

ThinkStation图形工作站进入BIOS方法
首先视频线需要接在独立显卡上,重新开机,持续按F1,或者显示器出来lenovo的logo的时候按F1,这样就进到bios里了。联*想*坑,戴尔贵。靠。...

go 集成base64Captcha 支持多种验证码
base64Captcha 是一个基于 Go 语言开发的验证码生成库,主要用于在 Web 应用中集成验证码功能,以增强系统的安全性。以下是其主要特点和简介: base64Captcha主要功能 验证码类型丰富:支持生成多种类型的验证码,包括纯…...

【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
目录 一.字符分类函数 1.1--字符分类函数的理解 1.2--字符分类函数的使用 二.字符转换函数 2.1--字符转换函数的理解 2.2--字符转换函数的使用 三.strlen的使用和模拟实现 3.1--strlen的使用演示 3.2--strlen的返回值 3.3--strlen的模拟实现 四.strcpy的使用和模拟实现…...
deepseek问答记录:请讲解一下hugingface transformers中的AutoProcessor
Hugging Face Transformers库中的AutoProcessor是一个用于自动加载与预训练模型配套的处理器的工具类。它简化了预处理流程,特别适用于多模态模型(如同时处理文本、图像、音频的模型)。以下是详细讲解: 1. AutoProcessor的功能 •…...

大模型基础之量化
概述 量化,Quantization,机器学习和深度学习领域是一种用于降低计算复杂度、减少内存占用、加速推理的优化方法。定义:将模型中的数据从高精度表示转换为低精度表示。主要目的是为了减少模型的存储需求和计算复杂度,同时尽量减少…...

游戏引擎学习第286天:开始解耦实体行为
回顾并为今天的内容定下基调 我们目前正在进入实体系统的一个新阶段,之前我们已经让实体的移动系统变得更加灵活,现在我们想把这个思路继续延伸到实体系统的更深层次。今天的重点,是重新审视我们处理实体类型(entity type&#x…...

win10-django项目与mysql的基本增删改查
以下都是在win10系统下,django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数:类名.objects.create(字段名值,字段名"值"。。。…...
Windows 本地部署MinerU详细教程
📖 项目概述 MinerU是一款由OpenDataLab开发的开源PDF转Markdown工具,可以高质量地提取PDF文档内容,生成结构化的Markdown格式文本。本指南将帮助您在本地部署并使用MinerU。 ⭐ 功能特性 MinerU具有以下核心功能: ✨ 文档处理…...

动态范围调整(SEF算法实现)
一、背景介绍 继续在整理对比度调整相关算法,发现一篇单帧动态范围提升的算法:Simulated Exposure Fusion,论文表现看起来很秀,这里尝试对它进行了下效果复现。 二、实现流程 1、基本原理 整体来说,大致可以分为两步…...

SpringCloud微服务开发与实战
本节内容带你认识什么是微服务的特点,微服务的拆分,会使用Nacos实现服务治理,会使用OpenFeign实现远程调用(通过黑马商城来带你了解实际开发中微服务项目) 前言:从谷歌搜索指数来看,国内从自201…...

WAS和Tomcat的对比
一、WAS和Tomcat的对比 WebSphere Application Server (WAS) 和 Apache Tomcat 是两款常用的 Java 应用服务器,但它们有许多显著的区别。在企业级应用中,它们扮演不同的角色,各自有其特点和适用场景。以下是它们在多个维度上的详细对比&…...
Rust 数据结构:String
Rust 数据结构:String Rust 数据结构:String什么是字符串?创建新字符串更新字符串将 push_str 和 push 附加到 String 对象后使用 运算符和 format! 宏 索引到字符串字符串在内存中的表示字节、标量值和字形簇 分割字符串遍历字符串的方法 R…...

IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?
检查.idea文件夹 如果项目目录中缺少.idea文件夹,可能导致项目结构无法正确加载。可以尝试删除项目根目录下的.idea文件夹,然后重新打开项目,IDEA会自动生成新的.idea文件夹和相关配置文件,从而恢复项目结构。 问题解决࿰…...

Hot100-链表-JS
160.相交链表 160. 相交链表 已解答 简单 相关标签 相关企业 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整…...

事件驱动架构:从传统服务到实时响应的IT新风潮
文章目录 事件驱动架构的本质:从请求到事件的范式转变在EDA中: 事件驱动架构的演进:从消息队列到云原生标配核心技术:事件驱动架构的基石与工具链1. 消息队列:事件传递的枢纽2. 消费者:异步处理3. 事件总线…...

网络流量分析 | NetworkMiner
介绍 NetworkMiner 是一款适用于Windows(也适用于Linux/Mac)的开源网络取证分析工具。它可被用作被动网络嗅探器/数据包捕获工具,也可被用于检测操作系统、会话、主机名、开放端口等,还能被用于解析pcap文件进行离线分析。点击此…...
弦理论的额外维度指的是什么,宇宙中有何依据
弦理论中的额外维度是解释微观世界与宏观宇宙矛盾的关键假设之一。它们并非科幻中的平行宇宙,而是通过严谨的数学框架提出,并可能留下可观测的宇宙学痕迹。以下是具体解析: 一、弦理论为何需要额外维度? 数学自洽性要求 弦理论中…...