面向对象程序设计

面向过程编程pop

概念

是以功能为中心,专注于问题解决,将整个需求分解为若干个步骤,每个步骤定义为一个函数,通过逐步调用函数来实现整个功能,完成需求。

它以函数为最小单位,强调的是功能和行为,主要考虑怎么做的问题,即算法。

举例:需求是张三早上开宝马去公司上班。梳理为如下步骤(只要实现就可以):

1.起床洗漱

2.进入车库,打开车门,坐入车内,系好安全带

3.踩刹车,打火启动车辆

4.挂前进档,驾驶车辆驶向目的地

5.到公司停车熄火解安全带下车关门锁车

优缺点

优点:符合人思考的思维方式,各个代码块分工很明确,需要实现的功能拆分的清晰明了。

缺点:数据和函数分开的,当数据结构发生改变时,所有和该数据有关的函数都要需修改。程序的维护性很差,不易于复用(程序在很多地方可以使用)和扩展(如果数据或功能发生改变,便于完成)

面向对象编程oop

概念

考虑的核心不是如何实现需求,而是将整个需求里面涉及到的事物找出来,将事物的特征用数据描述,并且抽象为属性(事物的特征,和其他事物的区别),将事物的行为(事物能干什么)抽象为方法(函数),最后,将这些事物的属性(特征)和方法(对行为的实现)封装到一起形成类,面向对象编程就是通过这些类的相互协作来完成整个需求。

它以类为最小单位。强调的是如何设计类,如何通过类之间的协作,完成需求的实现。

公式

面向对象编程=类+对象+封装+继承+多态+消息(对象调用属性或方法),其中封装+继承+多态 是面向对象程序设计的三大特性。

举例:需求是张三早上开宝马去公司上班。

面向对象编程进行分解:

1.找出整个需求中涉及到的事物:

​ 人类(张三)

​ 车(宝马车)

​ 公司(特指司)

2.再将事物的特征用数据描述并且抽象为属性:

​ 人类:姓名、性别、身份证号、工号、岗位

​ 车:车牌,车品牌,车型、手动或自动

​ 公司:公司名、营业执照编号、公司地址、经营范围、公司性质

3.将行为抽象为方法(函数):

​ 人类:会开车、会工作

​ 车:启动、行驶、加速减速、刹车、停车驻车

​ 公司:营业(提供产品或服务)、提供就业岗位

4.将属性和方法(函数)封装成类,然后使用这些类,将类实例化出来具体的对象,最后通过对象来调用类中的属性和方法(函数),实现整个需求。

类的概念

类是描述了一组具有相同的特征(属性)和相同的行为(方法)的对象,类是对象的模板,而对象是类的具体实例化。

对象

对象是现实世界中存在的事物,是类的一个具体实例,比如张三是人类的实例、宝马325是汽车的实例。

属性

属性就是类中的特征数据,也叫做类的数据成员。

方法

方法就是类中的函数,用来实现一个行为功能,也叫做类的成员函数

类与对象

类的定义

语法格式:
类的说明部分

一般放在头文件中.h结尾,用来声明的,不是用来实现的,头文件存放函数声明、类、静态变量等

class 类名//class是定义类的关键字,后面要跟上类名(标识符,按照规范应该使用大驼峰命名法,首字母大写,其他字母小写)
{//大括号表示类的作用域,称为类体private:私有的数据成员和私有的成员函数protected:保护的数据成员和成员函数public:公有的数据成员和成员函数//private、protected、public关键字,称为访问控制修饰符,描述类中成员的可见性
};//分号表示类定义结束
类的实现

可以在另一个源文件中,实现类中的成员函数

类中的成员函数可以在类内直接写出函数定义,这就是在类内实现,也可以只在类中声明函数的原型,但不写方法体,然后去类外实现函数的定义。

类需要写在main函数的外面。

//定义一个矩形类,类名是Rect
class Rect
{//属性:长和宽,命名规范:m表示类中成员,m_数据类型缩写+属性名(建议使用大驼峰命名法),一般是私有的,属于隐私。
private:int m_nLength;int m_nWidth;//方法(类中的成员函数),命名规范:以一个或多个单词来组成,第一个单词全小写,其余单词首字母大写。
public:void setLength(int nLen);//设置矩形的长度void setWidt(int nWidth);//设置矩形的宽度int getArea()//计算矩形的面积,计算一个值,返回,无需参数int getperimeter()//计算矩形的周长
};
//在源文件中实现头文件中类的方法体,需要在方法名前面加上类名和域运算符,如:Rect::
void Rect::setLength(int nLength)//设置长和宽
{m_nLength = nLength;
}
void Rect::setWidth(int nWidth)
{m_nWidth = nWidth;
}
int Rect::getArea()//计算面积和周长
{return m_nLength * m_nWidth;
}
int Rect::getperimeter()
{return (m_nLength+ m_nWidth)*2;
}
int main()
{//在这里使用类和对象完成程序的逻辑Rect r1, r2;//实例化出对象//通过对象名加点,来调用类中的函数r1.setLength(6);r1.setWidth(4);r2.setLength(10);r2.setWidth(5);cout << "r1的面积" << r1.getArea() << endl;cout<<"r1的周长"<<r1.getperimeter()<<endl;cout << "r2的面积" << r2.getArea() << endl;cout << "r2的周长" << r2.getperimeter() << endl;return 0;
}

2.2成员的访问控制

在类体中,有属性(数据成员)和方法(成员函数),他们在程序中的使用受到成员的访问权限的限制,如果没有声明访问控制权限,默认为私有权限访问权限分为三种:

private

私有的访问权限,在private关键字后声明的属性和方法具体私有访问权限,即只允许本类成员函数访问,在类外是无法访问的,属性一般设置为私有,目的是为保护对象的隐私

protected

保护访问权限,在protected后面声明的属性和方法具有保护访问权限,保护成员是有限访问的,即能被本类的成员函数访问,也能被派生类访问(继承的知识点,可以理解为本类的儿孙也可以访问),类外无法访问

public

公有访问权限,在public关键字后面的属性和方法具有公有访问权限,公有的成员对类内和派生类(子孙类)以及类外都可以访问(不做任何保护),一般会把方法设置为公有,因为方法需要对外提供调用服务

2.3类的数据成员和成员函数

类中的数据成员(属性),描述的是对象的特征,必须在类体中定义,他们的定义方式与一般的变量定义相同,但是受到访问控制修饰符的限制。

定义数据成员注意事项

1.数据成员初始化与变量初始化形式有所不同,不能使用小括号初始化,可以使用=或{}初始化。

2.数据成员的类型可以是任意类型,如果是数组类型,必须指定数组的大小。

3.多个数据成员之间是不能重名的,一个类作为一个作用域,不能重名。

4.类定义在前,使用在后。如果在类A中使用了类B(B是A类的属性),如果B还未定义,需要做一个前向声明:class B;

class B;
class A
{B m_Bobj;
};c
类中的成员函数(方法)

描述的是对象的行为,即该类对象能执行什么操作,目的是能完成什么功能,向类外提供一种服务。

定义成员函数的注意事项

1.类外定义成员函数时,需要在函数名前使用类名+域运算符来指定是哪个类的成员函数。

2.一个类中的多个成员函数可以重载,即函数名相同,但形参个数或类型不同。函数返回值是不能构成重载的。

3.类的成员函数也可以是内联函数,有两种方法可以定义内联函数,一种是将成员函数的定义直接写在类体中;另一种是在类外定义成员函数的时候,使用inline来声明。

4.类的成员函数的形参也可以有默认值。

2.4对象的创建和访问

对象的创建

如何使用一个类:先创建类的对象,然后操作对象完成具体的功能。在创建对象的时候,需要说明该对象所属的类,创建对象就是这个类的一次实例化过程。

举例:在栈内存空间创建对象:Rect r1;

在堆内存空间创建对象(动态创建):Rect *pr2=new Rect;

对象的访问(使用对象)

操作一个对象是通过访问对象的成员(属性和方法)来实现的。

如果是普通对象,可以使用.运算符去访问如r1.getArea,如果是对象指针,pr2->getArea()

类和对象的关系

类与对象是抽象和具体的关系,类是创建对象的模板,基于这个模板可以创建很多个对象,每个对象的属性值可以不同,但是共用了类中的方法。

在程序运行时类是静态的,无法改变的,而对象是动态的,对象的属性是可以被改变的。一个对象就是某个类的实例,创建对象的过程称为类的实例化。

对象被创建后才真正存在,对象具有一定的生命周期,我们可以通过对象名、指针、引用来区分对象。

一个类实例化出来的多个对象,他们分别拥有自己的属性,且相互独立,每个对象都要分配内存空间,而成员函数是有所有对象共享的。

对象占用内存空间的大小
cout<<"Rect类的大小:"<<sizeof(Rect)<<endl;类的大小
cout<<"Rect类的大小:"<<sizeof(r1)<<endl;r1对象的大小
cout<<"Rect类的大小:"<<sizeof(r2)<<endl;r2对象的大小
cout<<"Rect类的大小:"<<&r1<<endl;r2对象的地址
cout<<"Rect类的大小:"<<&r2<<endl;r2对象的地址

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

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

相关文章

高效PDF翻译解决方案:多引擎支持+格式零丢失

软件介绍 在AI翻译工具大行其道的今天&#xff0c;传统翻译软件市场逐渐饱和&#xff0c;但专业领域的深度需求依然存在。本文推荐的PDF翻译工具凭借20余种专业翻译接口&#xff0c;为学术文献、技术文档等复杂内容提供更精准的翻译服务&#xff0c;在保留文档原始排版的同时…

AI智能新标尺:诺姆·布朗谈token成本革命

第一章&#xff1a;从德州扑克到AI革命——诺姆布朗的“顿悟时刻” 1.1 从“人机对战”到“思维革命” 诺姆布朗的AI研究生涯始于2012年卡内基梅隆大学的实验室。彼时&#xff0c;国际象棋AI“深蓝”已横扫棋坛&#xff0c;围棋AI“AlphaGo”初露锋芒&#xff0c;但非完美信息…

碰一碰发视频系统开发者源码分析(一)

#碰一碰发视频系统# #碰一碰发视频saas系统#搭建 碰一碰发视频&#xff0c;是采用前沿技术搭载一套 AI 智能剪辑系统“碰一碰发视频”是一种基于近场通信&#xff08;NFC&#xff09;或蓝牙技术的创新交互方式&#xff0c;用户通过设备轻触即可触发视频传输或播放。本文将详细…

ROS2下MoveIt+Rviz+MuJoCo 三剑合璧!Panda 机械臂联动仿真!

视频讲解&#xff1a; ROS2下MoveItRvizMuJoCo 三剑合璧&#xff01;Panda 机械臂联动仿真&#xff01; 仓库代码&#xff1a;GitHub - LitchiCheng/ros2_package 今天介绍下&#xff0c;ros2下使用moveit在Rviz和mujoco联合仿真&#xff0c;结合上一期视频《MuJoCo 仿真 Pand…

Virtual BOX安装ubuntu及其环境配置(个人一些踩坑补充)

目录 设置中文操作界面和环境时候&#xff0c;下图内容切忌不要选错&#xff01;安装过程中因为分辨率原因&#xff0c;可能安装界面无法显示全面&#xff0c;如何临时解决这篇文章中的缺少如何调出中文输出法部分unbuntu换源安装terminal终端小鱼一键ros安装opencv环境配置 ub…

基于Spring Boot的三国之家网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

二分图相关

判断二分图&#xff08;染色&#xff09; #include<bits/stdc.h> using namespace std; void __p(int x) {cerr<<x;} void __p(long long x){cerr<<x;} void __p(long double x){cerr<<x;} void __p(double x){cerr<<x;} void __p(string s){cer…

java执行jar包提示没有主清单属性

以前都没遇到过这种情况&#xff0c;什么时候打jar&#xff0c; war包都没有遇到过&#xff0c; 按照网上说的创建了META-INF/MANIFEST.MF 还是报错 于是检查下maven 打包发现&#xff1a;竟然有skip 为true 去掉 skip true &#xff0c;进行打包&#xff0c;编译后正常

运动仿真——phased.Platform

在雷达仿真过程中&#xff0c;运动仿真的必要性&#xff0c;以及运动仿真可以实现哪些功能&#xff0c;在matlab对应的user guide中已经讲的很清楚了&#xff0c;这里不再赘述。 本文主要介绍phased.Platform的一些“坑”&#xff0c;和典型的用法。 第一坑&#xff1a;系统对…

用selenium+ChromeDriver豆瓣电影 肖申克的救赎 短评爬取(pycharm 爬虫)

一、豆瓣电影 肖申克的救赎 短评url=https://movie.douban.com/subject/1292052/comments 二、基本知识点讲解 1. Selenium 的基本使用 Selenium 是一个用于自动化浏览器操作的库,常用于网页测试和爬虫。代码中使用了以下 Selenium 的核心功能: webdriver.Chrome: 启动 Chr…

万象更新(一)VTK 坐标轴、相机方向坐标轴、立方体坐标轴

VTK 坐标轴、相机方向坐标轴、立方体坐标轴 1. 坐标轴、相机方向坐标轴、立方体坐标轴2. 坐标轴3. 相机方向坐标轴4. 立方体坐标轴 1. 坐标轴、相机方向坐标轴、立方体坐标轴 在 VTK&#xff08;Visualization Toolkit&#xff09;中&#xff0c;与坐标轴相关的组件主要包括 坐…

【Golang】go语言上下文context

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

ROS2与OpenAI Gym集成指南:从安装到自定义环境与强化学习训练

1.理解 ROS2 和 OpenAI Gym 的基本概念 ROS2&#xff08;Robot Operating System 2&#xff09;&#xff1a;是一个用于机器人软件开发的框架。它提供了一系列的工具、库和通信机制&#xff0c;方便开发者构建复杂的机器人应用程序。例如&#xff0c;ROS2 可以处理机器人不同组…

基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

### Java二维字符矩阵输入解析:正确读取由0和1组成的矩阵

在解决LeetCode等编程平台上的算法问题时&#xff0c;正确处理输入数据是解题的第一步。本文以Java语言为例&#xff0c;详细讲解如何正确读取由0和1组成的二维字符矩阵&#xff0c;并解决输入过程中可能遇到的换行符问题。 --- #### **问题背景** 题目要求从输入中读取一个二…

SEO监控看板搭建:基于Data Studio的实时数据可视化

在当今数字化营销的时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为企业获取流量、提升品牌曝光的重要手段。然而&#xff0c;SEO的效果往往需要通过数据来评估和优化。为了更高效地监控SEO表现&#xff0c;许多企业开始使用数据可视化工具来搭建SEO监控看板…

模糊数学 | 模型 / 集合 / 关系 / 矩阵

注&#xff1a;本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常&#xff0c;请看原文。 模糊数学模型&#xff1a;隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…

如何根据目标网站调整Python爬虫的延迟时间?

一、为什么需要调整爬虫的延迟时间&#xff1f; 1. 反爬虫机制的挑战 大多数网站&#xff08;尤其是电商平台如淘宝&#xff09;都部署了反爬虫机制&#xff0c;用于检测异常的访问行为。如果爬虫的请求频率过高&#xff0c;可能会触发以下反制措施&#xff1a; IP封禁&…

【嵌入式学习2】内存管理

## C语言编译过程 预处理&#xff1a;宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法&#xff0c;将#include #define这些头文件内容插入到源码中 gcc -E main.c -o main.i 编译&#xff1a;检查语法&#xff0c;将预处理后文件编译生成汇编文件&#xff…

案例分享|树莓派媒体播放器,重构商场广告的“黄金三秒”

研究显示&#xff0c;与传统户外广告相比&#xff0c;数字户外广告在消费者心中的记忆率提高了17%&#xff0c;而动态户外广告更是能提升16%的销售业绩&#xff0c;整体广告效率提升了17%。这一显著优势&#xff0c;使得越来越多资源和技术流入数字广告行业。 户外裸眼3D广告 无…