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. 以不同方式管理…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
