C嘎嘎~~ [类 上篇]

news2024/12/28 21:57:02

类 上篇

  • 1.面向过程和面向对象的认识
  • 2.类的引入
  • 3.类的定义
  • 4.类的访问限定符和封装
    • 4.1封装
    • 4.2访问限定符
  • 5.类的作用域

1.面向过程和面向对象的认识

面向过程 和 面向对象的区别:

面向过程关注的是过程, 而面向对象关注的是对象之间的关系, 交互.

C语言是面向过程的, 而C++是面向对象的.

就拿洗衣服这件事来给大家伙细说一下:

  • 面向过程: 洗衣服一共分为几个步骤/ 过程: 拿个盆子 => 放水 => 放衣服 => 放洗衣粉 => 手搓 => 换水 => 手搓 => 换水 => 手搓 => 甩干 => 晒干.

    C语言是关注这些过程是如何实现的, 通过函数逐步解决.

  • 面向对象: 这个过程中涉及哪些对象: 人, 衣服, 洗衣粉, 洗衣机.

    我并不关注洗衣服的过程, 只关注这几个对象的关系/ 交互.

    面向对象关注的是对象, 将一件事情拆分为多个对象, 靠对象的交互完成这件事情.

2.类的引入

类的渊源跟结构体很近哦~~

C语言的结构体只能在里面创建变量, 而C++ 的结构体里面不仅仅可以创建变量 还可以定义函数.

通过下面的代码, 进一步来了解类:

struct stack
{
public:
	void Init(int DefaultCapacity = 4)
	{
		int* a = (int*)malloc(sizeof(int) * DefaultCapacity);
		if (a == NULL)
		{
			perror("malloc fail");
			return;
		}

		top = 0;
		capacity = DefaultCapacity;
	}

	void Push(int data)
	{
		if (top == capacity)
		{
			int* a = (int*)realloc(a, sizeof(int) * capacity * 2);
			if (a == NULL)
			{
				perror("realloc fail");
				return;
			}
		}

		capacity *= 2;
		a[top] = data;
		top++;
	}

	int Top()
	{
		return a[top - 1];
	}

	void Destroy()
	{
		free(a);
		a = NULL;
		top = 0;
		capacity = 0;

	}

private:
	int* a;
	int top;
	int capacity;

};

int main()
{
	struct stack st;
	// stack st;
	// class st;

	st.Init();
	st.Push(1);
	st.Push(2);
	st.Push(3);
	st.Push(4);
	int top = st.Top();
	st.Destroy();

	return 0;

}

总结:

  1. C语言中的结构体在C++中就是一个类, 是类肯定就有类域. 类域的范围就是{}括起来的整体 ==> 类域是一个整体.

  2. 创建对象(一个个用 类 的变量)的时候, 有三种方式:(统一用stack 举例子)

    1. struct stack st === 这是C语言创建结构体的方式, 由于C++能够兼容C语言, 所以在运行的时候, 以 类 的形式运行
    2. stack st === 直接用结构体的名字去定义对象, 在C++中也是常见的
    3. class st === 在C++中, 更喜欢用 class 来代替 struct
  3. 上面第一条说过类域是一个整体, 所以在类域中, 直接可以使用在类域中的各种功变量

  4. 在类中, 函数直接写功能就行了(比如, 初始化直接写Init), 传统的C语言这里就要写 StackInit, 因为为了区别别的函数初始化(比如, 队列, QueueInit ), 要不然就构成重命名了. 大家想一想, 为啥在C++中, 不用害怕这种问题的出现?

    答案就是: 类是一个整体, 当然也有类域(作用域), 我在类域中起作用, 管你在你的类域中起作用什么事啊~~


有些老铁就有些疑问:

  1. 代码中, 有public 和 class,这涉及到类的权限问题, 这点我们在下面解释~~(5.类的作用域)
  2. 我们之前用C语言写的时候, 都会传一下栈的地址, 为啥这里不用传? 比如 Push函数, 函数调用时直接传个值过去就行了, 不是很理解哎!!(8.类的this指针)

3.类的定义

通过上面的例子, 我们初步掌握了类, 让我来给大家总结一下类的基本构成 和 定义吧:

class className
{
	// 成员函数
	// ...

	// 成员变量
	// ...

};

  1. 关键字是 class; className 是类的名字; {} 为类的主体(里面的内容是类的作用域); 后面的分号(😉 跟 结构体一样, 定义的时候不能省略

  2. 类里面的内容称为 类的成员: 类中的变量称为类的属性 或 成员变量; 类中的函数称为 类的方法 或 成员函数


类的两种定义方式:

  1. 声明和定义全部放在类体中, 需要注意的是: 一般编译器默认会将定义在类体中的函数是内联函数, 除非它不满足内联函数的要求

    class stack
    {
    public:
    	void Init(int DefaultCapacity = 4)
    	{
    		int* a = (int*)malloc(sizeof(int) * DefaultCapacity);
    		if (a == NULL)
    		{
    			perror("malloc fail");
    			return;
    		}
    
    		top = 0;
    		capacity = DefaultCapacity;
    	}
    private:
    	int* a;
    	int top;
    	int capacity;
    };
    
  2. 声明和定义分开放: 类声明放在.h文件, 成员函数的定义放在.cpp文件中, 唯一需要注意的是: 成员函数名前需要加上 类名 ::

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nLGR5rWJ-1682437865039)(../../AppData/Roaming/Typora/typora-user-images/image-20230425170325276.png)]

    关于这两种定义方式的选择:

    1. 如果函数比较短 ==> 我们可以直接定义在类体中, 使用内联函数, 何乐而不为~
    2. 如果函数过长 ==> 我们可以采用声明和定义分开的方式.
    3. 一般情况, 更倾向于第二种方式

补充:

  1. 通过 “声明和定义分开”, 其实我们不难发现: 在类中, 变量的优先顺序是: 局部域 > 类域 > 全局域(命名空间域)

  2. 全局域 和 局部域 会影响变量的生命周期, 而类域 和 命名空间域并不会影响变量的生命周期

  3. 通过上面的 “局部域 > 类域”, 如果有下面的例子, 我们该怎么优化?

    // 遇到这种情况, 你会怎么办?
    class Data
    {
    public:
    	void Init(int year, int month, int day)
    	{
    		year = year;
    		month = month;
    		day = day;
    	}
    
    private:
    	int year;
    	int month;
    	int day;
    
    };
    
    // 提供一种解决思路: 可以在成员变量前面加上 _ , 以示区别
    class Data
    {
    public:
    	void Init(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    
    private:
    	int _year;
    	int _month;
    	int _day;
    
    };
    

4.类的访问限定符和封装

4.1封装

先谈一谈C++实现封装的作用: 让对象更加完善, 通过访问权限选择性的将其接口提供给外部的用户使用, 便于管理

C++是实现封装的方式: 用类将对象的属性与方法结合在一起. 这里跟C语言比较一下: C语言是数据和方法是分开的, 没有在一起就会导致有些人会 “钻空子”, 将这个对象搞得混乱不堪, 变相的要求了C语言的程序员的素养要更高

相信, 不少老铁还不是很理解为啥要实现封装? 这里我就拿图书馆举个例子来说明吧:

如果图书馆不加以管理, 那么就会有这几种情况: 有些人素质很高, 很仔细第借阅书籍,不折书,对书籍充满了敬畏,然后借阅完毕就归还; 有些人素质就低一点, 他也是仔细地借阅书籍,但是折书, 借阅完毕也归还; 有些人素质就更低一点, 他即不认真借阅书籍,也折书,借阅完毕直接拿回去不归还了; 有些人就对书籍内心就毫无敬畏之心, 撕毁破坏书本, 借阅完毕根本没有归还之说.

如果图书馆加以管理, 就只会有一种情况: 只能遵从图书馆管理系统. 对于借阅者来说, 无论你的素质是否高尚; 对于图书馆管理员来说, 便于管理, 书本得到了很好的保护.

  • 面试题: 面向对象的三大特性: 封装, 继承, 多态. 那么在类和对象阶段, 主要是研究类的封装特性, 那什么是封装呢??

    解答:封装: 将数据和操作数据的方法进行有机结合, 隐藏对象的属性和实现细节, 仅对外公开接口来和对象进行交互,**

    封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有 开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑 真正工作的却是CPU、显卡、内存等一些硬件元件。

    对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的 等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时, 在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计 算机进行交互即可。 在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内 部实现细节,控制哪些方法可以在类外部直接被使用


4.2访问限定符

C++的访问限定符有三种: 1. public(公有), 2.protected(保护), 3.private(私有)

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束
  5. class的默认访问权限为private,struct为public(因为struct要兼容C

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

  • 面试题:C++中struct和class的区别是什么?

    解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和 class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是 private注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。

5.类的作用域

类定义了一个新的作用域, 类的所有成员都在类的作用域中. 在前面讲过, 如果在类外定义成员(注意, 这里只能说成员函数, 因为成员变量其实是一种声明哦), 需要使用 :: 作用域操作符来指明这些成员函数是属于这个类的.(要不然编译器就不知道这个函数的定义是全局域的还是类域中的~~)

class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	int _age;
	char _adress[20];

};

// 这里是指定PrintPersonInfo 是在 Person 这个类中的
// 要不然就能使用里面的成员变量~~
void Person:: PrintPersonInfo()
{
	printf("%s\n", _name);
	printf("%d\n", _age);
	printf("%s\n", _adress);

}

在这里插入图片描述

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

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

相关文章

webshell gif图片文件绕过

目录页/dev/index. php允许GIF上传。尝试上传不同的文件类型将被拒绝。 这可以通过首先上传合法的GIF文件来绕过。使用了一个小的GIF https://giphy.com/gifs/obi-won-hvE0PhVAnGQAo 下载一个小的字节图片测试 上传文件并使用Burpsuite捕获请求。尝试上传时的请求应类似于下…

淘宝天猫店铺新品如何运营?

新品在店铺运营过程中是十分重要的部分,你知道新品在店铺运营中有何作用?了解新品运营机制吗?今天就来快速了解关于新品的知识点。 新品在店铺运营的角色: 01、商品生命周期有限 商品的普遍生命周期在3个月左右,3个…

Codeforces Round 867 (Div. 3)

Problem - E - Codeforces 思路: 首先,如果n为奇数,中间那个数无法调整,所以只考虑偶数只有26个字母,我们用cnt[]记录每个字母需要交换的对数。设maxn为交换对数最多的字母。显然,如果cnt[maxn]>n/2,显…

速锐得解码奔驰CAN数据应用于海外车联网远程控制与防盗系统

人们常说,奔驰征服一切,你征服奔驰。速锐得帮你征服奔驰的数据。 前日,有个海外客户,问我们做了奔驰哪些数据,他们需要一个车联网的远程控制系统,用于管理他们的车队。客户比较豪横,大多数都是…

大数据管理中心规划设计方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 统一汇聚 推动业务数据协同5 价值提炼 支撑精准服务与科学管理6 实时感知 辅助城市治理高效运行7 大数据资源平台目标体系规划11 建设目标与思路12 使能高效协同&#xff0…

榜上有名 | 创宇盾荣登“2023 IT市场权威榜单”!

4月20日,已连续成功举办23届的IT市场年会在北京举行,作为权威咨询机构赛迪主办,中国IT业界延续时间最长的年度盛会之一,“2023 IT市场年会”隆重发布重磅权威榜单。 创宇盾作为云防护领域专业防护产品,在国家经济产业…

C++的默认成员函数

上一次我们说到了C的类,我们还知道在C的类中可以写函数,而且这个函数也属于这个类,我们可以直接使用这个类的对象去调用这个函数。 今天我们来看一下C的六个默认成员函数(这里说是6个,但是重要的只有4个) 构造函数 在C语言中&a…

Raft 共识算法3-日志复制

Raft 共识算法3-日志复制 Raft算法中译版地址:https://object.redisant.com/doc/raft%E4%B8%AD%E8%AF%91%E7%89%88-2023%E5%B9%B44%E6%9C%8823%E6%97%A5.pdf 英原论文地址:https://raft.github.io/raft.pdf Etcd Assistant 是一款 etcd 可视化管理软件&a…

idea使用 ( 一 ) 安装及初步使用

1.介绍 1.1.什么是 IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面]等工具。简单说就是开发工具,java开发中常用的…

一文读懂数据安全分级分类

目录 为什么要分级分类? 通用数据分级分类框架 数据分类 数据分类的常用方法 数据分类流程 数据分级 数据分级的常用方法 数据定级流程 行业数据安全分级分类指南 金融行业 电信行业 政务数据 健康医疗 企业实践 附录:数据分级分类大合集…

CAD格式交换全能:CAD DLL 15.0 Crack

添加对 SLDASM、FSAT、SAB、SMT、IPT 和 IFC 格式的支持。 2023 年 4 月 25 日 - 16:27 新版本 特征 改进的 3D: 打开 3D 文件时提高了速度。改进了对 SAT、STEP、SLDPRT、X_T、X_B、OBJ 格式的读取。添加了对 SLDASM、FSAT、SAB、SMT、IPT、IFC 格式的支持。添加了…

聊聊 maven的版本号version 以及maven指定版本号范围写法

1. 版本管理(version) 说了那么多废话,什么是版本管理?首先,一个健康的项目,通常有一个长期、合理的版本演变过程。版本管理是指项目整体版本的演变过程管理,就比如从1.0-SNAPSHOT --> 1.0 …

懂这3件事情,就能成功实施MES管理系统实现“数字化”工厂

当前,很多企业对MES管理系统需求旺盛,但是,要保证MES管理系统能够有效地实施,实现精益化管理,打造出一个“数字化”工厂,公司在实施MES管理系统之前,还必须弄明白为什么要MES管理系统、MES有什么…

QGIS数据可视化学习笔记04(完结)——POI检索和数据上图

一、POI数据检索概念 什么是POI检索?为什么要使用POI检索? 有的时候,我们可能不知道某个位置的地址,比如说北京朝阳图书馆,这个位置没有任何部门会去公布位置信息,但是我们又需要用到,这个时候就…

接口测试工具

工作当中有不少时间在编写和维护接口自动化测试用例。打算先整理一些接口相关工具的使用。 简单对接Web口测试的相关工具/技术做个划分。 HTTP/SOAP协议接口的功能测试: 1、浏览器URL(GET请求) 2、浏览器插件:Poster、Postman 简单…

科学防雷接地和雷电防护方案

说到防雷,可能不少人首先会想到避雷针,而“避雷针”这一概念,很容易让大家对防雷的概念造成误解。 误解1: 避雷针是用来“避雷”的。 其实,避雷针的学名叫“接闪器”,不是用来“避开雷击”的,而是用来“迎…

AI绘画——Checkpoint模型Dark Sushi Mix 大颗寿司Mix

目录 版本解析 模型简介 模型特性 模型演示(多图预警) Picture One 正面tag: 负面tag: Checkpoint模型darkSushiMixMix无Vae Checkpoint模型darkSushiMixMixVae模型kl-f8-anime2.ckpt Picture Two 正面tag:…

虹科案例|虹科Micronor光纤传感器,实现核磁共振新应用!

PART 1 背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大,因此,组件的电磁透明度在每一代和新应用中变得更加重要。 光学传…

Oracle系列之九:Oracle常用函数

Oracle常用系统函数 1. 字符串函数2. 数学函数3. 日期函数4. 聚合函数5. 其他 Oracle是一种关系型数据库管理系统,它提供了许多内置函数,以便用户可以更轻松地处理数据。 1. 字符串函数 (1)lengthb/length 计算字符串长度 len…

C++ POCO库的基础介绍(Windwos和Linux)

简单介绍C POCO库能干什么,后续有时间的话将根据其每个点详细解析,关注我。本篇包含POCO库简单介绍、下载以及安装方式、简单代码示例。 目录 一、POCO简单介绍 1.1 POCO库的基本模块 1.2 POCO库的优点 二、POCO库安装方式 2.1下载源代码编译安装 …