【C++技能树】再也不怕没有对象了 --初识类

news2025/1/13 19:59:07

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

目录

  • 0. 初识类
  • 1.类的引入
    • **在一个结构体里可以定义函数了:**
    • 定义一个Struct的时候再也不用写Struct了.
  • 2.类的定义
    • 类的两种定义方式:
    • 成员变量的命名规范:
  • 3.类的访问限定符与封装
    • 面试题:C++中的struct与class的差别是什么
  • 4.类的实例化
    • 类的空间计算

img

0. 初识类

我们先来看看C语言解决一个问题的过程。

假设有以下这个场景:你需要把大象放进冰箱,你需要做哪几步?

  1. 打开冰箱门
  2. 拿起大象
  3. 把大象放进冰箱
  4. 关上冰箱门

这是用C语言解决一个问题的过程,那么来看下C++是怎么解决这个问题的.

在C++当中,把每一个用到的对象抽离了出来,例如这里的:你,冰箱,大象都会被归类为一个个对象,而你们会有自己的属性,也就是自己的动作,而此时你就不需要去关注,人是怎么把大象拿起,怎么把大象放进冰箱,你只需要关心一个个对象之间的逻辑就可以了.
在这里插入图片描述

1.类的引入

先来看看我们之前最熟悉的C语言中的Struct在C++中他被升级成了类.

struct cdate{
	int _date;
	int _month;
	int _year;
};

这是在c语言中我们就会使用的方法,他被升级成类之后有了什么变化呢?

在一个结构体里可以定义函数了:

#include<iostream>
using namespace std;
struct cdate{
	int _date;
	int _month;
	int _year;
	int max(int a,int b)
	{
		return a>b?a:b;
	}
};
int main()
{
	cdate c;
	cout<<c.max(5,3);
}

这在c中是不可以的,不信的uu们可以去试试(要将文件名后缀改成C哦,不然编译器会以C++的标准来运行)

定义一个Struct的时候再也不用写Struct了.

这个直接看上面的cdate即可.

但在C++中更喜欢用Class来替换上面的struct,所以我们一般将代码写成这样:(关于public是什么意思接下来会解释,这里直接写就好啦)

#include<iostream>
using namespace std;
class cdate{
public:
	int _date;
	int _month;
	int _year;
	int max(int a,int b)
	{
		return a>b?a:b;
	}
};
int main()
{
	cdate c;
	cout<<c.max(5,3);
}

这就是一个类的大概状态啦,接下来我们将更详细的解释一下类的各部分.

2.类的定义

class classname
{
	//类体
};

class为定义类的关键字,classname为类的名字,{}中为类的主体,与结构体相同,结束时也需要加上一个;

所以类的组成由两个部分组成:类体与类名

类体中的内容称为类的成员:

1. 类的变量称为类的属性或成员变量
1. 类中的函数称为类的方法或者成员函数

类的两种定义方式:

类定义了一个新的作用域,仅能在这个作用域里访问其private成员

与C相同定义一个函数的时候也可以采用声明与定义放在同一个地方的方式:

class max{
public:
	int max(int a,int b)
	{
		return a>b?a:b;
	}
};

例如这里的max函数,但更推荐采用下面这种方式,将函数声明放在类中,定义写在这个类的外面(也可以解释为将类的声明放在头文件当中,类的具体定义放到源文件当中,这样做的好处和c一样),但注意,这样写要在定义处加上一个**类作用声明符**:

class cdate{
public:
	int max(int a,int b);
};
int cdate::max(int a,int b)
{
	return a>b?a:b;
}

其中**cdate:😗*为类作用声明符.

成员变量的命名规范:

看看这个函数:

class student {
public:
	void inname(int score)
	{
		score = score;
	}
	void print()
	{
		cout << score;
	}
private:
	int score = 0;
};
int main()
{
	student s1;
	s1.inname(80);
	s1.print();//80
}

这里定义了一个简单的student对象,对他的分数进行输入输出(一样private马上就会讲是什么东西),我们观察inname中的这段代码:

score=score

这里执行的结果本意是想要将外部传进的参数放进这个s1的score当中,但似乎外部的参数与内部的属性相互重合了.所以我们一般将内部属性命名添加一个_,来表示是内部的属性(不同的工作环境命名规范不同,但要有这么个意识)

所以这段代码应该写成这样:

class student{
public:
	void inname(int score)
	{
		_score=score;
	}
	string name;
	void print()
	{
		cout<<_score;
	}
private:
	int _score=0;
};
int main()
{
	student s1;
	s1.inname(80);
	s1.print();//80
}

3.类的访问限定符与封装

这里介绍以下上文提到的private,public,protected.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rat18YRK-1682583197802)(C:\Users\Aurora So\AppData\Roaming\Typora\typora-user-images\image-20230427155155872.png)]

  1. 在类中访问权限作用域一直到下一个访问权限符出现为止

  2. public修饰的成员在类外可以直接被访问

  3. private与protected(他们虽然有一些细微的差别,但先认为他们是一样的)修饰的成员在类外无法被访问,通常通过调用Public里的对应函数来进行访问.

面试题:C++中的struct与class的差别是什么

C++需要兼容C语言,所以**C++中的struct可以当成结构体用,同时也可以用来定义类.**区别是:struct的默认权限是public(为了兼容C语言)而class的默认权限是private

这三个限定符的作用是什么?

看看你面前的计算机,平常需要将其开机要做的就是按下面前的电源键,而不需要关心他的电路是如何运作的.这就是将电路进行了**private**,而将开机按钮的权限为 public,你可以直接通过这个public的方法去让他开机.也就是作为一个用户仅需要关注他能实现的功能而不需要去关注他的实现细节

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用

4.类的实例化

下面是一个类的定义(也可以叫模板,这里的模板与C++中的模板没有任何关系)

class student{
public:
	void inname(int score)
	{
		_score=score;
	}
	string name;
	void print()
	{
		cout<<_score;
	}
private:
	int _score=0;
};

可以把这个模板看作一个设计图,它本身不占空间,只是设计出了这个房子的构成.但你用这个设计图去造出一个个房子(实例化一个个对象).他就占空间了.

class student{
public:
	void inname(int score)
	{
		_score=score;
	}
	string name;
	void print()
	{
		cout<<_score;
	}
private:
	int _score=0;
};
int main()
{
	student s1;
	s1.inname(80);
	s1.print();//80
}

类的空间计算

还是那个设计图的例子,我们可以将一个类的函数比作这个小区的各种公共设施,每一个家庭都要用到电梯,但我需要为每一个家庭都装上一个电梯嘛?显然是不需要的,也就是说一个类的函数是公用的,他们被存储在了公共代码区.而每一个家庭里的设施虽然都是从模板里设计出来的,但是会有一些差异,所以我们需要保存每一个对象的属性.

所以类的存储模型就是这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5T2WXMZ4-1682583197802)(C:\Users\Aurora So\AppData\Roaming\Typora\typora-user-images\image-20230427160649248.png)]

所以计算一个对象的所占内存大小的时候仅需计算成员属性的内存大小(其符合结构体内存对齐的规则)

class student{
public:
	void inname(int score)
	{
		_score=score;
	}
	void print()
	{
		cout<<_score;
	}
private:
	int _score=0;
	char _name;
};
int main()
{
	student s1;
	cout<<sizeof(s1);//8
}

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

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

相关文章

05 【Sass语法介绍-插值】

1.前言 在很多编程器语言中都有插值这个概念&#xff0c;在 Sass 样式表的任何地方几乎都可以使用插值&#xff0c;你可以将这些包裹在 #{} 中来使用&#xff0c;所以记住在 Sass 中使用插值的方式是 #{} &#xff0c;本节我们一起来看一下插值在 Sass 中的使用场景以及它的语…

Authing 入选《2022年度中国高科技高成长企业》榜单

​ 近日&#xff0c;Authing 入选【2022 年度中国高科技高成长企业系列榜单 】- 【云原生高成长企业榜】&#xff0c;该榜单由【第一新声】联合【天眼查】发起的“数字中国”系列之 2022 年度中国高科技高成长企业系列榜单发布&#xff0c;该榜单旨在发现和挖掘被资本市场关注&…

Sentinel介绍及搭建

分布式流量防护 服务雪崩 服务提供者不可用导致服务调用者也跟着不可用&#xff0c;以此类推引起整个链路中的所有微服务都不可用 分布式流量防护 在分布式系统中&#xff0c;服务之间的相互调用会生成分布式流量。如何通过组件进行流量防护&#xff0c;并有效控制流量&…

如何在 Mac 和 Windows 上恢复未保存或删除的 PDF

Adobe Acrobat PDF 是一种常用格式。我们可能会在不同的 PDF 编辑器中编辑和保存 PDF 文件。但是&#xff0c;如果不保存 PDF 文件或不小心将其删除&#xff0c;那将是一种令人不安的体验。 保持冷静&#xff01;首先&#xff0c;尽可能多地停止运行应用程序&#xff0c;这样它…

( 哈希表) 217. 存在重复元素 ——【Leetcode每日一题】

❓217. 存在重复元素 难度&#xff1a;简单 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true&#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true…

工作7年的程序员,明白了如何正确的“卷“

背景 近两年&#xff0c;出台和落地的反垄断法&#xff0c;明确指出要防止资本无序扩张。 这也就导致现在的各大互联网公司&#xff0c;不能再去染指其他已有的传统行业&#xff0c;只能专注自己目前存量的这些业务。或者通过技术创新&#xff0c;开辟出新的行业。 但创新这…

go-zore入门,可能看这一篇就行了

本文主要内容 微服务框架对比goctl的安装和使用go-zore的api服务go-zore的rpc服务一探负载均衡的实现方法服务发现使用consul代替etcd实现服务发现中间件的实现相关代码已传送至gitee点击获取代码文中相关连接无跳转请点击查看原文 go微服务框架对比 参考文档 在 Go 语言中&…

AI | 浅谈AI技术以及其今后发展

文章概要 近期AI成为热点话题&#xff0c; GPT&#xff0c; new bing&#xff0c; bard&#xff0c;AI 绘画等 AI 编程工具引发大量讨论。请结合自身学习与工作经历&#xff0c;一起来聊聊你对AI技术以及其今后发展的看法吧。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介…

【VSCode】1、VSCode 如何连接服务器

文章目录 一、安装 remote-ssh 插件二、直接连接三、配置 SSH 公匙&#xff0c;免密登录 一、安装 remote-ssh 插件 点击插件搜索框&#xff0c;搜 remote-ssh&#xff0c;点击安装 安装完成后就会出现下面的图标&#xff1a; 二、直接连接 点击加号&#xff0c;输入 ssh 连接…

Web前端(更新中)

文章目录 什么是WEB前端HTMLHTML的简介运行环境和开发环境标签的语法结构页面的分类 常用标签head中常用标签body中的常用标签&#xff0c;特殊符号&#xff0c;语义化标签 什么是WEB前端 简单来说就是网页&#xff0c;由多种技术参与制作的&#xff0c;向用户展示的页面 技术…

Java 20和IntelliJ IDEA,一起让开发变得更轻松!

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 相…

JavaScript 中函数 柯里化风格的运用

导语 当我第一次看见 柯里化 这个词语的时候&#xff0c;我也表现出一脸懵&#xff0c;在代码程序中&#xff0c;看见这种 “高大上”的一些词汇叫法的时候&#xff0c;下意识的会觉得这个概念很难很深奥&#xff0c;但是当冷静下来&#xff0c;去深究过后&#xff0c;就会发现…

Jetson 学习笔记(十六):使用SDK Manager烧录Jetson Nano

SDK Manager 前期准备开始安装 前期准备 安装VMware虚拟机&#xff0c;Ubuntu系统&#xff0c;VMware tools&#xff0c;然后在Ubuntu中安装Nvidia SDK Manager&#xff0c;最后进行烧录。 VMware、Ubuntu系统以及VMware tools&#xff1a;安装链接Nvidia SDK Manager&#x…

ArcGIS Pro数据

目录 1 数据模型 1.1 矢量数据 1.2 栅格数据 1.2.1 栅格数据用途 1.2.2 影像数据地理属性 1.2.3 影像分辨率 1.2.4 栅格波段 2 常用数据格式 2.1 CAD 2.1.1 CAD格式 2.1.2 CAD要素数据集 2.1.3 CAD要素数据集要素类 2.1.4 ArcGIS Pro支持的AutoCAD和MicroStation要…

为什么Web自动化测试需要掌握多种技能?看完就知道了

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 1.编程语言 2.Web开发知识 3.自动化测试框架 4.版本控制系统 5.数据库基础知识 历史进程&#xff1a;…

详解RocketMQ ACL机制的设计实现原理

一、序言 RocketMQ在4.4版本之后为我们提供了ACL权限校验机制,可以实现针对Topic资源级别的用户访问权限控制,ACL的实现能够在一定程度上保证RocketMQ集群数据的安全性。试想一下,如果没有ACL权限校验,在生产环境上只要部署任意的RocketMQ控制台就可以对topic进行操作,存…

【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何通过 8 个必备技巧确定工作任务的优先级

你的每项任务都同样紧急吗&#xff1f; 你是否制定了一个简单的待办事项清单&#xff0c;并从头到尾地完成每一项任务&#xff1f; 如果你实际上没有对任务进行优先排序&#xff0c;那么这个项目会被拉长。当你不知道如何根据你或你的团队的效率进度来确定项目的优先次序时&a…

Flutter 透明视频播放插件——基于字节跳动AlphaPlayer

字节跳动&#xff1a;AlphaPlayer GitHub - bytedance/AlphaPlayer: AlphaPlayer is a video animation engine. 关于透明视频 透明视频的播放&#xff0c;对于webm格式的视频&#xff0c;在h5上面是很容易播放的 但是对于android或者flutter来说&#xff0c;尤其flutter的…

PoE、PoE+、PoE++交换机功率用途有何不同

随着网络部署终端的设备越来越多&#xff0c;场景千差万别、布署时间有先有后&#xff0c;因此通过PoE交换机为其远程供电是最佳的选择。我们一般常见的PoE、PoE交换机比较多&#xff0c;PoE目前还有待进一步被人了解&#xff0c;这三款的区别可以从历史进程上来进行总结归纳。…