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. 以不同方式管理…...

Linux命令-continue命令(结束本次循环,继续执行下一个for,while或until循环。)
概要 continue [n]主要用途 结束本次循环,继续执行下一个for,while或until循环;可指定从第几层循环继续执行。 参数 n(可选):大于等于1的整数,用于指定从第几层循环继续执行。 返回值 返回…...

智能部署之巅:Amazon SageMaker 引领机器学习革新
本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 (全球 TMT 2023年12月6日讯)亚马逊云科技在 2023 re:Invent 全…...

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?
我自己试用了很多的平台,发现三个比较好的大模型平台,对普通用户也比较的友好的,而且返回内容相对来说,正确率更高的,并且相关场景插件比较丰富的国内厂商。 本文说的,是我自己觉得的,比较有主观…...

python如何打包py文件为exe
要将Python程序打包为可执行文件(.exe),您可以使用一些第三方工具。以下是两个常用的工具:PyInstaller和cx_Freeze。 使用PyInstaller PyInstaller是一个流行的Python打包工具,可以将Python程序及其所有依赖项打包为…...

yolov9网络结构图
文章目录 配置文件主干分支backbone预测头headyolov9网络结构图 系列文章目录 论文链接:👿 YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information代码链接:👿 https://github.com/WongKinYiu/yolov9…...

Spark 核心API
核心 API spark core API 指的是 spark 预定义好的算子。无论是 spark streaming 或者 Spark SQL 都是基于这些最基础的 API 构建起来的。理解这些核心 API 也是写出高效 Spark 代码的基础。 Transformation 转化类的算子是最多的,学会使用这些算子就应付多数的数…...

OpenLayers线性渐变和中心渐变(径向渐变)
目录 1.前言2.添加一个面要素3.线性渐变3.1 第一个注意点3.2 第二个注意点 4.中心渐变(径向渐变)5.总结 1.前言 OpenLayers官网有整个图层的渐变示例,但是没有单个要素的渐变示例,我们这里来补充一下。OpenLayers中的渐变是通过fi…...

[210. 课程表 II] 拓扑排序模板(DFS+BFS)
Problem: 210. 课程表 II 文章目录 思路解题方法Code 思路 本题是经典拓扑排序模板,通过DFS和BFS两种方式进行实现。 解题方法 DFS DFS方法的重点在于如何标记节点状态,初做题者如果只用未访问和已访问两种状态很容易陷入死结。正确的做法是使用三种状…...

我的第一个python web 网站
# -*- coding: utf-8 -*-import http.server import socketserver from datetime import datetimePORT 8000import sys# ...class MyHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):if self.path /:# 如果路径是根路径,返回页面内容self.send_r…...

产品展示型wordpress外贸网站模板
孕婴产品wordpress外贸网站模板 吸奶器、待产包、孕妇枕头、护理垫、纸尿裤、孕妇装、孕婴产品wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4112 床品毛巾wordpress独立站模板 床单、被套、毛巾、抱枕、靠垫、围巾、布艺、枕头、乳胶枕、四件套、浴巾wordpre…...