C++初阶 类和对象(上)

前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

目录

一、什么是面向对象编程

二、什么是类和如何定义类

1.类的概念

2.类的特点

3.访问限定符

4.如何定义类

5.类定义的小细节

6.类的大小如何计算?

7.this指针

三、下期预告


一、什么是面向对象编程

在C语言中,我们编写代码更多地是面向过程进行编写的,通过分析出求解问题的步骤,然后函数调用逐步解决问题。比方说洗衣服,在C语言的实现就是打开洗衣机->放衣服进去->倒入洗衣液->关上洗衣机->启动洗衣机->洗衣机翻滚->洗衣机甩干......如此一步一步地实现。

而在C++中更多的是面向对向对象进行编写的。洗衣服这个操作,操作的对象便有4个,洗衣机,洗衣液,衣服和人,洗衣服在C++的实现则是使用这4个对象互相交互实现的,而人是不需要去关注洗衣机是如何去洗衣服的,只需要把事情交给洗衣机干就行了。这便是面向过程编程和面向对象编程的区别。

二、什么是类和如何定义类

1.类的概念

其实在C语言的学习中,我们已经接触到了类这一内容,那便是我们的结构体, 而在C++中更喜欢将结构体称作类。在C语言中我们使用struct定义结构体,在C++中我们不仅可以通过struct定义类,也可以通过class定义类。两种方式几乎一样,只有一点是不太一样的,后面在访问限定符中我们会讲到。

2.类的特点

相比于C语言中结构体的使用,类的使用更显特别,类的里面不止可以定义成员,还可以定义成员函数,更有趣的是它可以令部分内容为私有,令部分内容为公有。什么是公有呢,在类外面也可以访问,而私有则相反,只能在类中使用,听上去是不是有点抽象,没关系,我们在之后的内容会有详细的讲解。

3.访问限定符

在讲解如何定义类之前我们还要再补充一点,那便是访问限定符。类的访问限定符分为三种:public(公有的),protected(被保护的),private(私有的),private和protected在目前的学习中是可看作一样的,之后需要使用到它们之间的特性时会特别强调,当然这还要很久。回到之前的问题,struct和class有什么区别?

区别就在于struct定义的类默认是公有的,class定义的类默认是私有的。

1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。

4.如何定义类

方法1:声明和定义全部放在类中

#include<iostream>
using namespace std;
class abc
{
public:
//公有的,意味着可以被外界访问
	void init()
	//初始化函数
	{
		_a = 520;
		_b = nullptr;
		_c = 13.14;
	}
	void print()
	//打印函数
	{
		cout << _a << endl;
		cout << _b << endl;
		cout << _c << endl;
	}
private:
//私有的,不能被外界访问
	int _a;
	int* _b;
	double _c;
};
int main()
{
	abc a1;
	//创建一个类型为abc的变量a1;
	a1.init();
   //初始化
	a1.print();
	//打印
}

简单运行下

 试着访问下私有,报错

方法2:声明和定义分离:

在写类的成员函数时肯定会有同学想像之前一样,将多个函数的定义写在同一个文件中。这是可以实现的

声明写在头文件中

定义写在对应文件中

一样可以运行出正确结果 

5.类定义的小细节

不知道你们有没有发现,博主在定义类的成员变量的时候在变量之前加了_定义了_a,_b,_c这样的变量,为什么博主不直接定义a,b,c呢?当我们在进行赋值操作的时候,令成员变量变为另一个参数时,我们书写的代码很可能是这样的,a对应a,b对应b,c对应c。

当有同名变量出现的时候,编译器会根据就近原则进行运行,也就是令100=100,200=200,300=300并不会真正影响到我们创建的abc中的成员变量,为了方便区分,我们在创建类的时候,通常会在成员变量前加_或者是后加_,如此便可以很快速的识别出变量的用途,对变量进行对应的赋值。 

6.类的大小如何计算?

先说一个结论:类的计算是不包括this指针和成员函数的,this指针等下会讲到。如何计算类的大小,有如下规则(把结构体换成类即可)

(1) 第一个成员在与结构体变量偏移量为0的地址处。
(2) 其他成员变量要对齐到某个对齐数的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。
VS中默认的值为8
(3) 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
(4) 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


自定义类型详解_大海里的番茄的博客-CSDN博客

博主写的这篇文章有更详细的解答,感兴趣的同学可以去看一下。

7.this指针

学过C语言的同学看这个传递变量的过程一定会觉得怪怪的:为什么不用.或者->就能够修改结构体的成员变量呢(类),那是因为我们C++有一个隐藏的变量被传递过去了,那便是this指针,this指针存放了你所传递变量的地址   且在中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

当然你想要显示的实现变量的访问过程也是可以的,两者没有区别。如果你之前写的是C语言,现在一定会很爽QAQ。

最后需要提醒的一点细节便是this指针为了方便调用一般存储在寄存器上。

三、下期预告

下一回我们来聊下构造函数和析构函数,这周必出餐QAQ

好了,今天的分享到这里就结束了,感谢各位友友的来访和阅读,祝各位友友们前程似锦O(∩_∩)O 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

白银期货投资指南,轻松搞定白银投资

在今天的金融市场中&#xff0c;白银已成为备受瞩目的投资选择。不仅如此&#xff0c;白银还是避险资产的首选之一&#xff0c;兼具保值和增值的潜力。万洲金业将为您提供一份白银期货投资指南&#xff0c;让您轻松了解白银投资&#xff0c;助力在白银交易市场获得潜在收益。 …

mpp解码详解

解码器数据流接口 一. decode_put_packet 输入码流的形式&#xff1a;分帧与不分帧 MPP 的输入都是没有封装信息的裸码流&#xff0c;裸码流输入有两种形式&#xff1a; 不分帧 这种方式是已经按帧分段的数据&#xff0c;即每一包输入给 decode_put_packet 函数的 MppPacket 数…

Spring事务失效的几种情况及其解决方案

Spring事务失效的几种情况及其解决方案 方法权限修饰符不是public Transactional 使用的是 Spring AOP 实现的&#xff0c;而 Spring AOP 是通过动态代理实现的&#xff0c;而 Transactional 在生成代理时会判断&#xff0c;如果方法为非 public 修饰的方法&#xff0c;则不生…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议&#xff0c;邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子&#xff0c;可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

MongoDB——MongoDB删除系统自带的local数据库

一、MongoDB删除系统自带的local数据库 1.1、linux环境进入mongo客户端 输入 mongo 命令&#xff0c;进入命令行客户端 进入admin库&#xff0c;并登录&#xff0c;查看所有数据库 #进入admin库 use admin #并登录admin db.auth("username","password")…

【论文笔记】Unifying Large Language Models and Knowledge Graphs:A Roadmap

&#xff08;后续更新完善&#xff09; 2. KG-ENHANCED LLMS 2.1 KG-enhanced LLM Pre-training 以往将KGs集成到大型语言模型的工作主要分为三个部分:1)将KGs集成到训练目标中&#xff0c;2)将KGs集成到LLM输入中&#xff0c;3)将KGs集成到附加的融合模块中。 2.1.1 Integr…

大语言模型(LLM)综述(五):使用大型语言模型的主要方法

A Survey of Large Language Models 前言6 UTILIZATION6.1 In-Context Learning6.1.1 提示公式6.1.2 演示设计6.1.3 底层机制 6.2 Chain-of-Thought Prompting6.2.1 CoT的上下文学习6.2.2 关于CoT的进一步讨论 6.3 Planning for Complex Task Solving6.3.1 整体架构6.3.2 计划生…

基于松鼠算法的无人机航迹规划-附代码

基于松鼠算法的无人机航迹规划 文章目录 基于松鼠算法的无人机航迹规划1.松鼠搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用松鼠算法来优化无人机航迹规划。 1.松鼠搜索算法 …

pytorch复现_NMS

NMS&#xff08;非极大值抑制&#xff09;阈值是用于控制在一组重叠的边界框中保留哪些边界框的参数。当检测或识别算法生成多个边界框可能涵盖相同物体时&#xff0c;NMS用于筛选出最相关的边界框&#xff0c;通常是根据它们的置信度分数。 具体来说&#xff0c;NMS的工作原理…

Linux系统jdkTomcatMySQL安装以及J2EE后端接口部署

目录 一、jdk&Tomcat安装 1.1 上传安装包到服务器 1.2 解压对应工具包 1.3 配置环境变量并测试jdk安装 1.4 启动tomcat 1.5 防火墙设置 1.5.1 开启/关闭防火墙以及防火墙状态查看 1.5.2 开放防火墙端口 二、MySQL安装 2.1 卸载mariadb 2.2 在线下载MySQL安装包(…

2015年美亚杯全国电子数据取证大赛个人

做题 1.请找出如下windows XP系统信息&#xff1a;&#xff08;10分&#xff09; a. 系统安装时间 &#xff08;YYYY/MM/DD&#xff09; 考时间 我们先去看看该电脑的时区 都是东八区 那我们直接看时间 因为题目没有要求我们时间 答案为 2015-08-07 16:45:52 转为格式 201…

【zip密码】如何取消zip压缩包的密码?

我们想要对压缩包进行加密&#xff0c;但是当我们不需要加密压缩包的时候&#xff0c;该如何取消zip压缩包密码呢&#xff1f;那么zip压缩包密码取消都有什么方法呢&#xff1f;今天将方法总结分享给大家。 最原始的方法&#xff0c;就是通过解压文件&#xff0c;将解压出的文…

uniapp 微信小程序 授权隐私流程 网上没有的踩坑记录!

首先什么时候我们需要授权操作&#xff0c;比如下图我们调用这些接口时候首先必须让用户授权&#xff0c;这个政策是2022年2月21日24时起对一下接口增加用户授权操作&#xff0c;详情可以看微信文档 授权的逻辑按照官网的意思是&#xff1a; 这个时候就踩坑了&#xff0c;我把…

这个电力问题难倒90%的人,但我只用一招就搞定!

随着现代社会对电力需求的不断增加&#xff0c;配电系统的可靠性和安全性变得至关重要。为了确保电力系统的稳定运行&#xff0c;配电柜监控系统应运而生。 配电柜监控系统通过实时监测和控制电力分配&#xff0c;提供了对电力系统状态的详细洞察&#xff0c;以帮助运维人员及时…

编程助手DevChat:让开发更轻松

#AI编程助手哪家好&#xff1f;DevChat“真”好用 # 目录 前言一、安装Vscode1、下载链接2、安装 二、注册DevChat1、打开注册页2、验证成功完成邮箱绑定3、绑定微信可获得8元 三、安装插件四、配置Access Key1、获取Access Key2、设置Access Key①、点击左下角管理&#xff08…

linux jdk配置

1.下载jdk &#xff0c;以jdk1.8为例子 Java Downloads | Oracle JDK 8 Update Release Notes (oracle.com) 2.配置环境变量 1.下载相关jdk版本&#xff0c;执行以下命令安装jdk tar -zxvf jdk-8u144-linux-x64.tar.gz 2.编辑命令 vi /etc/profile 3.在最后加入下面配置 e…

Kafka - 3.x 消费者 生产经验不完全指北

文章目录 生产经验之Consumer事务生产经验—数据积压&#xff08;消费者如何提高吞吐量&#xff09; 生产经验之Consumer事务 Kafka引入了消费者事务&#xff08;Consumer Transactions&#xff09;来确保在消息处理期间维护端到端的数据一致性。这使得消费者能够以事务的方式…

JAVA 实现PDF转图片(pdfbox版)

依赖&#xff1a; pdf存放路径 正文开始&#xff1a; pdf转换多张图片、长图 Test void pdf2Image() {String dstImgFolder "";String PdfFilePath "";String relativelyPathSystem.getProperty("user.dir");PdfFilePath relativelyPath &qu…

4.4 多态

思维导图&#xff1a; 4.4 多态 在深入研究对象的世界后&#xff0c;我们已经学到了封装和继承。接下来&#xff0c;我们要讨论的是面向对象编程的另一个核心概念&#xff1a;多态。 4.4.1 多态概述 多态是面向对象的三大特性之一&#xff0c;它允许我们以统一的方式处理不同…