C++初阶之类与对象(上)详细解析

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

 

目录

 

一.前言

二.类的定义和使用

2.1类的引入

2.2类的定义和访问限定符

2.21定义

2.2.2访问限定符

2.2.3代码示例以及对上面的分析

2.2.4封装

2.3类的内存对齐

2.3.1类中的函数的位置

2.3.2小问题

2.3.3内存对齐

2.3.4内存对齐意义


 

一.前言

        在前面我们写过C++入门中的函数重载,命名空间,缺省参数,引用,还有一些新的语法, 这些内容是我们学习后面的基础,在今天我主要给大家带来关于类的内容,其中包括类的定义和使用,访问限定符封装,类的实例化,计算类的大小以及内存对齐。

二.类的定义和使用

2.1类的引入

        在c语言期间我们的结构体你还记得吗?在C++中祖师爷对它进行了升级,升级成了我们的类,我们写一个代码表示C语言中的结构体:

struct A {int num1;int num2;int* p;
};

我们定义变量时使用:

struct A a;

如果我们想定义一个函数,我们需要在结构体外进行声明和定义。

那我们在C++中是如何使用结构体呢?我们看下面的代码

struct Data {int _year;int _month;int _day;void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
};int main()
{Data d1;d1.Init(2024, 1, 31);return 0;
}

在C++中我们更喜欢使用class来定义。

2.2类的定义和访问限定符

2.21定义

        class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。(也就是说我们将class代替我们的struct,当然struct也可以,{}中包含的分为两部分一是成员变量,一部分是成员函数)。

2.2.2访问限定符

        访问限定符包括3个分别是public(公开),private(私有),protected(保护),其中public可以任意访问,protected和private不能任意访问只能在类里面访问,访问权限是从第一个访问限定符到下一个访问限定符之间,struct默认为public,class默认为private。

2.2.3代码示例以及对上面的分析

#include<iostream>
using namespace std;class Data {
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Data d1;d1.Init(2024, 2, 1);d1.Print();return 0;
}

        我们采用class的形式,我们的第一个限定词是public第二个限定词是private,其中public的作用域是public到private,private的作用域是从private到结尾。在main函数中我们定义的d1可以称为我们的对象,我们访问public作用域的内容时我们直接利用对象去访问,下面的访问方式是不对的:

	Init(2024, 2, 1);Data::Init(2024, 2, 1);

ea91906658b94a8c97dc5d88d7a7c4d9.png

这两种都存在存在问题,都是不正确的,对于public作用域的我们可以在类的里面和外面进行访问   ,那对于private或protect作用域的内容呢?我们看到在定义Init函数时我们在类里面就使用了我们private的内容,因此在类里面可以访问,那类外面呢?我们看下面

	d1._year = 1;Data::_year;

这两种都是会报错的

252078794bd242e3b448ebc423ee2abb.png

所以我们可以看到private作用域的变量或函数只能在类里面进行访问,不能在类外访问,由于private和protect在这里一样,所以不做过多演示。

2.2.4封装

        我们可以将封装看成一种管控,c++将变量和方法放在类里面,允许让我们访问的使用public进行修饰,不想让我们访问的使用private或protected进行修饰。

2.3类的内存对齐

2.3.1类中的函数的位置

        我们需要知道,类中函数的位置,类中函数和成员变量是放在不同的位置,

5cd1913f4be04223a6b5bc1273f69a3c.png

如果我们定义一个指针

	Data d1;Data* p = &d1;

我们需要知道p指向成员变量。

2.3.2小问题

        我们看下面的代码输出结果是什么:

#include<iostream>
using namespace std;
class Data {
public:void Print(){cout << "Print()" << endl;}
};int main()
{Data d1;Data* p = &d1;p->Print();return 0;
}

很显然我们的结果是Print();

那我们的这行代码输出结果是什么呢?

	Data* p = nullptr;p->Print();

 是不是很多人说对空指针的解引用,会导致空指针的解引用,其实这样的结果还是Print(),为什么呢?我们看上面类的成员变量和成员函数是分开的,我们的p是指向我们的成员变量的区域,无论成员变量是什么样子,我们的函数区域是不变的。

	Data* p = nullptr;(*p).Print();

我们这个代码个上面的一样,都会正常运行。 

2.3.3内存对齐

        类的内存对齐和我们在前面c语言中的内存对齐一样,在vs中我们的对齐数为8,我们的Data中_year占0,1,2,3的位置,_month占4,5,6,7,。_day占8,9,10,11占12个12是4的倍数所以占12个,在这里不做具体解释,不理解的可以在内存对齐中查看。

2.3.4内存对齐意义

        我们知道了内存对齐,那它有什莫意义呢?我们这样舍弃空间是为什么呢?我们需要知道一些机器一次只能访问4个或8个字节,我们以4个字节为例,

9ba735349bf34c1aab5e7679c724be85.png

如果我们一次访问4个字节,第一种没有对齐的int需要访问两次,第一期是前三个字节,第二次要访问第4个字节,而第2种我们能访问int能直接进行访问,这样可以减少我们的访问次数,我们采用内存对齐是一种空间换时间的方式,这就是内存对齐的意义。

三.this指针

        this指针是默认生成的,类型为*const 我们不能在形参和实参的位置显示写,但函数种可以用,这是this指针的定义,我们看一看相关代码

#include<iostream>
using namespace std;class A {
public:A(int a = 1){_a = a;}void Print(A*const this){cout << _a << endl;}
private:int _a;
};int main()
{A a;a.Print(this);return 0;
}

我们的代码就会报错,错误如下:

7080d49f9a0944e5961ca134fd39dfc9.png

如果我们将Print函数中加上this呢?

	void Print(){cout <<this-> _a << endl;}

程序就会正常运行。 

四.总结

        今天的内容就结束了,这些都是类的基础,大家可以认真看看,对于后面的内容非常重要。最后希望大家可以一键三连。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习-常用API(一)

Object类 Object类及其常用方法&#xff1a; 代码示例&#xff1a; Objects Objects类的引入&#xff0c;定义及其常见的方法&#xff1a; 示例 包装类 什么是包装类&#xff1f; 自动装箱和自动拆箱&#xff1a; 常用方法&#xff1a; 注意&#xff1a;字符串的 数值&#xf…

1Panel面板如何安装并结合内网穿透实现远程访问本地管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

写函数判断闰年

实现函数判断year是不是润年。 下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10&#xff0c;变量 B 的值为 20&#xff0c;则&#xff1a; 运算符描述实例/分子除以分母B / A 将得到 2%取模运算符&#xff0c;整除后的余数B % A 将得到 0 已经知道判断闰年标准…

2024 Google Chrome 浏览器回退安装旧版本

2024 Google Chrome 浏览器回退安装旧版本 查看当前谷歌版本备份浏览器数据卸载浏览器双击重新安装旧版本浏览器 查看当前谷歌版本 详细参考&#xff1a;参考 笔记&#xff1a;最近谷歌浏览器更新后&#xff0c;用着总感觉别扭&#xff1a;不习惯 备份浏览器数据 &#xff…

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)-2.0.1

客户端注册临时实例&#xff0c;GRPC处理 客户端服务发现 及订阅处理

CloudStack中控制台虚拟机调试

在CloudStack环境中&#xff0c;有时我们需要对系统虚拟机进行调试或者替换其中的JAR包。本文将详细介绍如何通过SSH连接到CloudStack的系统虚拟机&#xff0c;并进行相关的调试和JAR包替换操作。 1. 连接系统虚拟机 首先&#xff0c;我们需要使用SSH连接到目标系统虚拟机。这…

13、gitlab

13、gitlab 4c8g、100g docker安装gitlab&#xff08;使用k8s的ingress暴露&#xff09; 版本&#xff1a;https://gitlab.com/gitlab-org/gitlab-foss/-/tags?sortversion_desc 官方docker仓库&#xff1a;https://hub.docker.com/r/gitlab/gitlab-ce/tags docker pull gi…

为什么要使用Node.JS

脚本语言需要一个解析器才能运行&#xff0c;JavaScript是脚本语言&#xff0c;在不同的位置有不一样的解析器&#xff0c;如写入html的js语言&#xff0c;浏览器是它的解析器角色。而对于需要独立运行的js&#xff0c;nodejs就是一个解析器。 每一种解析器都是一个运行环境&a…

力扣经典题:单值二叉树

思路&#xff1a;验证根节点与左右节点的关系即可&#xff0c;然后向下遍历&#xff0c;此题值得注意的点在于要考虑左右节点为空的情况 bool isUnivalTree(struct TreeNode* root) {if(rootNULL){return true;}if(root->left!NULL&&root->val!root->left-&g…

Hadoop3.x基础(4)- Yarn

来源&#xff1a;B站尚硅谷 目录 Yarn资源调度器Yarn基础架构Yarn工作机制作业提交全过程Yarn调度器和调度算法先进先出调度器&#xff08;FIFO&#xff09;容量调度器&#xff08;Capacity Scheduler&#xff09;公平调度器&#xff08;Fair Scheduler&#xff09; Yarn常用命…

【数据分析】Excel中的常用函数公式总结

目录 0 引用方式0.1 相对引用0.2 绝对引用0.3 混合引用0.4 3D引用0.5 命名引用 1 基础函数1.1 加法、减法、乘法和除法1.2 平均数1.3 求和1.4 最大值和最小值 2 文本函数2.1 合并单元格内容2.2 查找2.3 替换 3 逻辑函数3.1 IF函数3.2 AND和OR函数3.3 IFERROR函数 4 统计函数4.1…

Elasticsearch中Document Routing特性

Document Routing在Elasticsearch中是一种高级特性&#xff0c;它允许用户在索引文档时指定一个路由值。通过这种方式&#xff0c;可以确保具有相同路由值的所有文档都存储在同一个分片中。这对于提高查询效率特别有用&#xff0c;因为它允许查询只针对包含相关文档的特定分片&…

解决dockor安装nginx提示missing signature key的问题

问题描述 使用dockor安装nginx拉取nginx的时候提示key丢失问题 问题定位 由于dockor版本低导致 问题解决 卸载重新安装最新版本dockor 解决步骤 1. 卸载旧版本的Docker&#xff1a; sudo yum remove docker docker-common docker-selinux docker-engine 2. 安装依赖包&am…

5、安全开发-Python-红队项目漏扫工具API推送微信任务自动添加并启动

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 目标&#xff1a; 利用Python脚本调用漏洞扫描工具API批量扫描目标url&#xff0c;发现漏洞后有所通知&#xff0c;解放双手。 一、漏洞扫描-API调用-Xray 参考&#xff1a;快速开始 - xra…

82个demo代码|35000字带你认识和学会所有 C++11 algorithm头文件中所有算法函数|algorithm头文件函数用法大全

C <algorithm> 头文件的学习 文章目录 C <algorithm> 头文件的学习参考网站非修改序列操作all_ofany_ofnone_offor_eachfindfind_iffind_if_notfind_endfind_first_ofadjacent_findcountcount_ifmismatchequalis_permutationsearchsearch_n 修改序列操作copycopy_n…

Matplotlib交互

python中matplotlib实现随鼠标滑动自动标注代码 python鼠标画线条 python鼠标拖动曲线 惊了&#xff01;matplotlib也能交互式展示数据&#xff1f; 如何在保持x与y比例不变的情况下缩放pyplot图形&#xff1f; How to animate a scatter plot How can I pass parameters …

【JS逆向八】逆向某企查网站的headers参数,并模拟生成 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 加密方法&#xff1a;未知 / 标准库Hmac-SHA512 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加…

突破编程_C++_面试(基础知识(8))

面试题20&#xff1a;什么内存对齐 以结构体为例来说明内存对齐&#xff1a; 结构体对齐是编译器在内存中布局结构体成员时遵循的一种规则。对齐的目的是提高内存访问效率&#xff0c;减少因内存访问不对齐而引发的性能下降或硬件异常。 在大多数系统中&#xff0c;数据对齐通…

pydantic了解学习

文章目录 什么是pydantic安装pydanticpydantic主要特性数据验证数据解析和序列化简化数据处理 什么是pydantic Pydantic是一个Python库&#xff0c;用于数据解析和验证。通过定义类模型并设定类型注解&#xff0c;Pydantic可以确保我们在处理数据时&#xff0c;数据的格式和类…

Java学习15-- 面向对象学习3. 对象的创建分析【★】

&#xff08;本章看不懂多读几遍&#xff0c;弄懂后再往下章看&#xff09; 面向对象学习3. 对象的创建分析 Java Memory Structure: 如上图所示&#xff1a; 主要分为Stack和Heap Memory 其中Stack主要放method包括main 程序从main开始所以main最先进入Stack&#xff0c;等…