C++篇----类、封装、类访问权限、类实例化

news/2024/11/17 0:47:23/

文章目录

  • 一、面向过程和面向对象
  • 二、类


一、面向过程和面向对象

c语言是面向过程的编程语言 c++是面向对象的编程语言

面向过程:关注过程,对于求解问题的不走,调用函数逐步解决问题 就洗衣服来说:洗衣服需要放水,倒洗衣粉,排水,甩干,晾衣服
面向对象:关注的是对象,在洗衣服这一整体来说,参与的对象有人,洗衣粉,洗衣机,衣架(注重的是哪些参与了)关注的是对象 一个外卖系统
面向过程 点餐、上架、派单、送餐(关注过程步骤) 面向对象:
关注整个外卖系统它的对象是哪些(商家、用户、骑手)它们之间的关系,对象和对象之间的交互 将现实世界类和对象映射到虚拟计算机系统

二、类

c++兼容c语言以前的语法,struct以前的用法在c++也可以用 但是在c++中,将原本c语言中的结构体(struct)升级为了类
而在c++中,以class来代替struct作类
类:class为类的关键字,class className
class表示为类,className为类名

#include<iostream>
using namespace std;struct Stack
{int* a;int top;int capacity;
};int main()
{//c语法struct Stack st1;//c++将struct升级为类,此时Stack为类名,可以直接用其来定义变量(对象)Stack st;return 0;
}

类域

类形成了一个新的作用域:类域。不同类有各自不同类域,就像不同函数有不同局部域一样, 所以在不同类中定义重名成员不构成重定义
类中成员当前面的成员访问在它后面的成员是,不需要提前声明,因为类域是一个整体,在类域中访问它的成员可以随时访问
类域是一个整体不分前后访问顺序,类中前面的成员可以访问在其后面的成员

而类它的成员较结构体新增了成员函数(方法),可以在类中直接定义函数

以栈为例
struct

struct Stack
{//在一般情况下还需要在前面加栈的前缀,但是现在就在这个类中直接将栈的实现写出void Init(int defaultcapacity = 4)//类成员函数(方法){a = (int*)malloc(sizeof(int) * defaultcapacity);if (nullptr == a){perror("malloc fail\n");return;}top = 0;capacity = defaultcapacity;}void Push(int x){//...扩容a[top++] = x;}void Destroy(){free(a);a = nullptr;top = capacity = 0;}int* a;int top;int capacity;
};int main()
{Stack st;st.Init();return 0;
}

在这里插入图片描述

class

#include<iostream>
using namespace std;class Stack
{
public://在一般情况下还需要在前面加栈的前缀,但是现在就在这个类中直接将栈的实现写出void Init(int defaultcapacity = 4){a = (int*)malloc(sizeof(int) * defaultcapacity);if (nullptr == a){perror("malloc fail\n");return;}top = 0;capacity = defaultcapacity;}void Push(int x){//...扩容a[top++] = x;}void Destroy(){free(a);a = nullptr;top = capacity = 0;}int* a;int top;int capacity;
};int main()
{Stack st;st.Init(4);//不可访问,当加了权限访问符(public)就可以访问了return 0;
}

在这里插入图片描述

可以发现,struct关键字定义的类可以通过,而class定义的类无法通过,且class定义的类报了个无法访问的错误

访问权限
那是因为类有访问权限,三大访问权限

public:公开权限,外部用户可以访问到类中成员
protected:将类中成员保护起来不让类外部成员访问
private:只能在类域中访问,类域之外无法访问

以struct关键字作为类,它的默认访问权限是公开的(public)权限
以class关键字作为类,它的默认访问权限是私有的(private)权限

所以一般情况下,要让类之外使用到类中的哪些成员,需要用public权限访问

访问权限作用域为多大?访问权限作用域从访问符出现的位置起到下一个访问权限限定符出现的位置为止,
如果之后一直没有出现下一个访问权限限定符,那么直到类域结束
在这里插入图片描述

public到private之间的类成员是公开的,类之外能访问,而public访问的权限到private为止

封装

类将数据与实现这些数据的方法封装起来,用类将对象的属性(数据)与方法(成员函数)结合起来,让对象更加完善
将数据与方法封装起来,那么在外部用户访问它时它可以指定将哪些成员开放让别人访问到,也可以使不想让外部用户访问到的成员隐藏起来,那么类是如何使它的成员可以让别人访问与否?加访问权限

类成员函数声明与定义

那么类,它的成员函数可以将声明和定义分离吗?可以 在类中声明的函数在类域之外定义需要有作用域限定符::代表它是类的成员函数,
在这里插入图片描述

且在函数实现时
函数中的变量来自于类的话,它要去类中找,当表明这个定义的函数是类中的成员函数是,在函数中 的变量先在函数中找,然后在类域找最后全局找
在类域外边定义函数,函数前指定类域代表这个函数也就不是普通函数了,而是类中一个成员函数的定义

而且类的成员函数,定义和声明没有分离时,这个函数就是内联函数,当然只是建议编译器这个函数为内联函数
如果代码量特别大,编译器也不会接收这个建议

类成员名一般规则

类成员变量一般以_作为前缀,由于类成员函数在定义时,有可能会定义与成员变量重名,所以类,成员变量一般以_开头

#include<iostream>
using namespace std;
class Year
{
public:void is_year(int year){//先用局部域在用类域_year = year;cout << _year << endl;}int _year;
};int main()
{Year y;y.is_year(2002);cout << y._year << endl;return 0;
}

类实例化

类中成员变量只是有一个声明,并没有定义,所以没有开空间 相当于房子,只是有图纸,还没有建成真是的房子,还不能住人
只有声明并不能给声明的变量赋值,将其对象定义出来才是类的实例化
在这里插入图片描述
没有将类对象实例化出来,就访问它的成员变量,根本访问不到,相当于图纸上面画了有房子,但是现实世界中并没有将其建造出来,而仅凭一张图纸,是找不到房子的


http://www.ppmy.cn/news/53220.html

相关文章

vue的diff算法原理

diff 概念diff比较流程头头尾尾头尾尾头比对查找过程 与vue3的区别 diff 概念 vue基于虚拟DOM做更新&#xff0c;diff的核心就是比较两个虚拟节点的差异。 vue的diff算法是平级比较&#xff0c;不考虑跨级比较的情况。内部采用深度递归 双指针的方式进行比较 diff比较流程 先…

算法训练 | Day41动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

【前端笔记】前端包管理工具和构建打包工具介绍之npm、yarn、webpack、vite

一、NPM包管理工具 1.1、什么是NPM NPM&#xff08;Node Package Manager&#xff09;是node包管理器&#xff0c;是node.js默认采用的软件包管理系统&#xff0c;使用JavaScript语言编写。包管理可以理解为依赖管理&#xff0c;有一个npm包管理仓库&#xff0c;当我们执行np…

UML--类图--软件工程系统学习-- idea查看类图-类关系图

文章目录 什么是类图类图的用途类图的组成 类什么是类类符号类关系依赖&#xff08;Dependence&#xff09;idea查看依赖 关联关系&#xff08;association&#xff09;继承/泛化idea查看继承 实现&#xff08;realization&#xff09;聚合组成组合和聚合之间的差异 类图详解id…

“量子+生成式AI”!IBM联合生物制药公司Moderna进行疫苗研究

​ &#xff08;图片来源&#xff1a;网络&#xff09; 4月20日&#xff0c;以COVID-19疫苗而闻名的生物技术和制药公司Moderna Inc.表示&#xff0c;宣布正在与IBM公司合作&#xff0c;利用量子计算和生成式人AI探索推进研究mRNA技术的方法。 双方签署了一项协议&#xff0c;允…

Vue组件-非单文本组件

非单文本组件(用的少) 在vue中&#xff0c;组件是有两种编写格式的&#xff0c;第一种格式叫非单文本组件&#xff0c;第二种格式叫单文本组件 非单文本组件&#xff1a;一个文件中含有多个组件&#xff0c;也叫多文本组件&#xff0c;比如demo.html里面包含js,css… 单文本…

blast的-max_target_seqs?

Shah, N., Nute, M.G., Warnow, T., and Pop, M. (2018). Misunderstood parameter of NCBI BLAST impacts the correctness of bioinformatics workflows. Bioinformatics. 杂志Bioinformatics以letter to the editor的形式刊发了来自美国马里兰大学计算机系的Nidhi Shah等人…

Windows子系统保存位置更改释放C盘(最简单)

Windows子系统保存位置更改 目录 使用场景解决思路操作流程关闭子系统找到文件存放地址新的路径文件迁移创建链接 使用场景 使用WSL(Linux子系统)做深度学习开发&#xff0c;在微软的应用商店安装的Ubuntu22.04会将系统默认安装在C盘&#xff0c;随着使用时间测增长&#xff…