C++初阶:类与对象(初篇)
目录
- 1. 类与对象
- 1.1 引子:结构体与类
- 1.2 什么是类(类的定义方式)
- 1.3 类和结构体的区别
- 1.4 类的访问限定符与封装
- 1.4.1 访问限定符
- 1.4.2 类的作用域与类的实例化
- 1.5 类对象的模型
- 1.5.1 类内部资源的存储方式
- 1.5.3 类大小的计算方式
- 1.6 this指针
- 1.6.1 this指针的引入
- 1.6.2 this指针的特性
1. 类与对象
1.1 引子:结构体与类
- 在C语言中我们学习过自定义类型结构体,其内部可以创建自定义类型的变量与内置类型的变量来满足我们的需要。
- 结构体的产生是为了描述简单内置类型无法定义的复杂对象。
- 我们知道,计算机是帮着人们解决现实世界问题的工具,将问题使用编程语言描述出来并传递给计算机来进行解决,为了更好的贴近现实生活,由此有了结构体的概念。
- 当我们引入面向对象的概念(C++初阶)之后,结构体已经无法满足我们的需求,为了更好的解决问题,我们引入类与对象的概念。
1.2 什么是类(类的定义方式)
- 定义方式:类名(关键字Class + 类名)+ 类体(成员变量 + 类方法 + 访问限定符)
class [这个类的名称]
{
public://类的成员变量
private://类方法
};
- 补充:C++中成员变量命名方式
注:类的内部方法可以直接访问类的成员变量
class Date
{
private:int year;int month;int day;public: void Init(int year){//无法正常赋值year = year;}
};
上述操作会导致命名冲突,编译器无法识别,发生错误,所以建议类的成员变量前都加下划线
_
class Date
{
private:int _year;int _month;int _day;
}
- 类方法的声明与定义分离
//class.h
class Date
{
private: int _year;int _month;int _day;
public:void Print();
}//class.c
void Date::Print()
{cout << _year << '-' << _month << '-' << _day << endl;
}
- 类方法声明与定义方式分离的方式,可以提高代码的可读性
- 在类内部定义的方法会被默认为内联函数
1.3 类和结构体的区别
当我们分别使用类与结构的方式定义栈,两者有何差异。(C语言中的结构体)
结构体:
//定义方式
struct Stack
{int* _data;int _capacity;int _top;
};void StackInit(Stack* stack)
{stack->_data = NULL;stack->_capacity = stack->_top = 0;
}//调用方式
struct Stack stack1;
StackInit(&stack1);
类:
//定义方式:
class Stack
{
public:int* _data;int _capacity;int _top;void Print(){cout << _capacity << endl;}
};//调用方式:
Stack stack1;
stack1.Print();
定义方式与内部结构:
- 结构体内部只能定义变量,而类还可以定义方法
- 类有访问限定符,决定其内部成员变量是否可以访问(只有public的情况下可以访问)
调用方式:
- 创建变量时,结构体类型的全名为struct + 结构体名,而类只需要使用Class关键字之后的类名
- 类可以直接调用类方法,而结构体只能将自己作为参数传参给指定函数
注:上述区别为C语言中结构体与类的区别,在C++中对这一方面有了调整与补足,C++结构体中也可以定义方法,使用时也可以省略关键字(struct)
1.4 类的访问限定符与封装
面向对象三大特点:封装,继承,多态
1.4.1 访问限定符
- 公有:public,类外可以直接访问
- 私有:private,类外无法访问
- 保护:protect,类外无法访问
注:访问的限定符的作用域为从限定符开始到下一个限定符/类的末尾结束
访问限定符的作用与存在意义:
- 对类内部资源进行访问与操作权限区分,提高了内部资源的安全性,隐藏了类实现的细节,方便数据的管理
- 使得对类的使用变得简单
- 因为有访问限定符对类内部资源权限的不同划分,由此而实现了对类的封装
1.4.2 类的作用域与类的实例化
- 类体内是一个独立的作用域,其内部的所有成员在类的作用内,而在类内部声明外部定义的成员,在定义时需要声明类域,如此才能够访问类内部的资源。
class A
{
public:int _a;void Print();
};void A::Print()
{cout << _a << endl;
}
- 我们自定义类的使用,与结构体,自定义类型的使用类似,同样为类型 + 创建对象名(变量)的定义方式
- 类的实例化,我们定义的类并非实体,只是一个抽象的模板,如果将类实例化出的对象比作具体现实存在的高楼,那么类就是这些高楼的建筑图纸
class B
{
public:int _b;void Print(){cout << _b << endl;}
}//实例化方法
B b1;
//访问实例化对象,内部成员的方式
b1._b = 10;
//调用内部方法的方式
b1.Print();
1.5 类对象的模型
1.5.1 类内部资源的存储方式
我们通过上面的学习了解到,类是由两部分组成的,成员变量 + 成员函数,我先通过简单控制变量的方式来初步分别查看两者存储方式。
- 成员变量:
class A
{int _a;
};cout << sizeof(A) << endl;
- 增加成员函数:
class A
{int _a;void Print(){cout << _a << endl;}
};cout << sizeof(A) << endl;
通过上述尝试,我们不难发现,成员函数的增加并没有使得类的大小增加,所以成员函数并没有存储在类的内部
1.5.3 类大小的计算方式
类内资源的存储方式:
- 成员函数不存储在类的内部,在类内声明定义的函数实则定义在类外,在类内的声明定义更类似一个声明的操作,声明此函数为这个类的成员函数
- 类的成员变量存储在类的内部,遵循内存对齐的规则(C语言结构体)
class C
{};
- 特殊的,空类的大小并不为空,而是会有一个字节来标识其的存在
1.6 this指针
1.6.1 this指针的引入
- 经过学习我们知道成员函数的定义并不在类中,那么成员函数是怎么分辨是哪一个实例化对象在调用它,又是如何访问实例化对象的成员变量呢?
- 这里我们引入类成员函数中的一个隐藏参数,this指针
- 在C++中,其实编译器给每个非静态成员函数在定义时都赋予一个隐藏参数,this指针,该指针会默认指向调用它的实例化对象,我们对于实例化对象中成员变量的访问其实都是通过它来实现的
1.6.2 this指针的特性
- this指针的类型为,自定义类的指针(A*)const,这代表着此指针无法改变指向,不允许被修改
- this指针只能够在成员函数的内部使用
- this指针本质上是函数的形参,并不存储在类的内部
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递
class A
{
public:int _a;void Print1(){cout << _a << endl;}void Print2(){cout << this->_a << endl;}void Print3(){cout << *this._a << endl;}
}//三种调用方式本质相同
A a1;
a1.a = 10;
a1.Print1();
a1.Print2();
a1.Print3();
注:
- C++中类的实现方法,在本质上与C中结构体的实现并无不同,只是C语言这些细节与过程需要我们自己调控,而C++中会由编译器来代为维护完成。
- C++中还给类添加了访问限定符,对类进行了封装,提高了资源的安全性,便利了我们的使用
相关文章:
C++初阶:类与对象(初篇)
目录 1. 类与对象1.1 引子:结构体与类1.2 什么是类(类的定义方式)1.3 类和结构体的区别1.4 类的访问限定符与封装1.4.1 访问限定符1.4.2 类的作用域与类的实例化 1.5 类对象的模型1.5.1 类内部资源的存储方式1.5.3 类大小的计算方式 1.6 this…...
Docker 创建容器并指定时区
目录 1. 通过环境变量设置时区(推荐)2. 挂载宿主机的时区文件到容器中3. 总结 要在 Docker 容器中指定时区,可以通过两种方式来实现: 1. 通过环境变量设置时区(推荐) 在 Docker 运行时,可以通…...
springboot文件上传修改临时文件路径
1、配置:spring.servlet.multipart.location/data/tmp 2、代码 Configuration public class MultipartConfig {Value("${spring.servlet.multipart.location}")private String tmpLocation;Beanpublic MultipartConfigElement multipartConfigElement()…...
testvue-新增图表功能(教师那边-后续放到管理员那边)-src/main.js ,router/index.js
1.安装--然后在src/main.js中 导入 和 使用2修改:common/sidebar.vue ,page/ echarts.vue , router/index.js , src/main.js 3sidebar.vue <template><div class"sidebar"><el-menuclass"sidebar-el-menu":default-active&quo…...
[HackMyVM]Quick 2
kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…...
Mybatis-Plus实现Service封装
文章目录 5.1 MP封装Service介绍5.1.1 说明5.1.2 实现流程5.1.3 核心API介绍 5.2 MP封装Service快速入门5.2.1 定义服务扩展接口5.2.2 定义服务实现5.2.3 测试测试 5.3 MP封装Service实现CRUD操作 5.1 MP封装Service介绍 5.1.1 说明 MybatisPlus为了开发更加快捷,…...
平台工程指南:从架构构建到职责分工
平台工程只是 DevOps 专业化的另一个术语,还是另有所指?事实可能介于两者之间。DevOps 及其相关的 DevXOps 有着浓厚的文化色彩,以各个团队为中心。不幸的是,在许多地方,DevOps 引发了新的问题,如工具激增和…...
Docker系列之docker与docker-compose离线安装
docker离线安装 一、离线安装包二、安装命令三、配置四、docker-compose 一、离线安装包 上传离线安装包至/root/目录下,docker离线安装包下载链接。 二、安装命令 cd /root mkdir k8sOfflineSetup tar -xzvf k8sOfflineSetup-2020-02-20.tar.gz -C k8sOfflineSe…...
css flex 布局换行
默认使用display: flex;是不换行的,只需要加上flex-wrap: wrap;就行了,效果图 .app-center {display: flex;flex-wrap: wrap;justify-content:flex-start; } 通过上面我们发现虽然时间换行了,但是每行的边距不一样 加上这个就行了ÿ…...
使用腾讯云快速搭建WordPress网站流程详解
专栏系列文章: WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么?为什么用它建站?怎么安装与部署? 初次安装WordPress后如何进行网站设置(主题安装、…...
JavaScript发展历史与JavaScript的版本发展
JavaScript是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。它最初由Netscape公司的Brendan Eich设计,并于1995年在网景导航者浏览器上首次实现。由于Netscape与Sun合作,并希望其外观与Java相似,因此被命名为JavaScrip…...
零基础如何系统自学Python
零基础系统自学Python 学习前的准备 明确学习目标 Python 一共有两大版本,即 Python2 以及 Python3,Python2 已停止维护,强烈建议直接上手 Python3。Python 可以说是无所不能,主要有以下几大方向,建议选择自己感兴趣…...
华为OD机试 - 字符串统计(Java 2024 C卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&a…...
LeetCode-数组-前缀和-中等难度
前缀和 前缀和是一种利用预处理的方式来减少整体实现复杂度的方法。 基本定理 假设原数列A为:[1,2,3,4,5],与之对应的前缀和数列P则为:[1,3,6,10,15] 前缀和数列的第一项等于原数列的第一项,从第二项开始前缀和数列每一项计算…...
【程序人生】探索2024年AI辅助研发趋势
目录标题 探索2024年AI辅助研发趋势一、AI在编码中的应用智能代码生成助力开发错误检测与修复的即时反馈性能优化的智能建议 二、AI驱动的自动化工具三、AI与团队协作四、未来展望结语 探索2024年AI辅助研发趋势 随着人工智能技术的迅速发展,AI在各个领域的应用正日…...
集合框架(一)Collection
学习过了ArrayList,知道集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。 为了满足不同的业务场景需求Java还提供了很多不同特点的集合给我们选择。 集合体系结构 Collection是一个接口&a…...
Android 性能优化--APK加固(2)加密
文章目录 字符串加密图片加密如何避免应用被重新签名分发APK 加壳的方案简析DEX加密原理及实现 本文首发地址:https://h89.cn/archives/212.html 最新更新地址:https://gitee.com/chenjim/chenjimblog 通过 前文 介绍,我们知晓了如何使用代码…...
Linux环境下使用interrupt方式操作UART
目录 概述 1 Linux环境下UART设备 2 轮询方式操作UART功能实现 2.1 打开串口函数:usr_serial_open 2.2 关闭串口函数: usr_serial_close 2.3 发送数据函数: usr_serial_sendbytes 2.4 接收数据函数: usr_serial_readinterr…...
修改Android打包apk的名字和目录
app打包生成apk后通常需要进行备份,但是要区分好哪个apk是什么版本的、什么时候打包的,以方便以后区分使用。 最开始的想法是把版本号、创建时间这些加在apk文件名上即可,但是公司要求apk使用一个固定的名称,那我怎么保存版本号信…...
管理 PostgreSQL 中配置参数的各种方法
管理 PostgreSQL 中配置参数的各种方法 1. 概述 PostgreSQL提供了一个配置文件 postgresql.conf 让用户自定义参数。您可能需要更改一些参数来调整性能或在工作环境中部署 PostgreSQL 服务器。在这篇博文中,我们将探索管理这些参数的不同方法。 2. 以不同方式管理…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
