C++ (第二天下午---面向对象之类与对象)

一、面向过程与面向对象

1、面向过程
面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
在这里插入图片描述
举个例子,下五子棋,面向过程的设计思路是首先分析解决这个问题的步骤:

开始游戏, 
黑子先走, 
绘制画面, 
判断输赢, 
轮到白子, 
绘制画面, 
判断输赢, 
返回步骤2, 
输出最后结果

可见,面向过程始终关注的是怎么一步一步地判断棋局输赢的,通过控制代码,从而实现函数的顺序执行。

2、面向对象(OOP)
在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,用面向过程的思想是远远不够的。所以慢慢就出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在整个解决问题的步骤中的属性和行为。
在这里插入图片描述
在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:

1)黑白双方,这两方的行为是一样的。
(2)棋盘系统,负责绘制画面
(3)规则系统,负责判定犯规、输赢等。

然后赋予每个对象一些属性和行为:

第一类对象(黑白双方)负责接受用户输入,并告知
第二类对象(棋盘系统)棋子布局的变化,棋盘系统接收到了棋子的变化,并负责在屏幕上面显示出这种变化,同时利用
第三类对象(规则系统)来对棋局进行判定。

可以看出,面向对象是以功能来划分问题,而不是以步骤解决。比如绘制画面这个行为,在面向过程中是分散在了多个步骤中的,可能会出现不同的绘制版本,所以要考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘系统这个对象中出现,从而保证了绘图的统一。

练习1:使用面向过程的C语言实现面向对象的方法

#include <iostream>using namespace std;//C结构体
typedef struct {//属性char name[256];int age;int height;//行为 --函数指针void (*eat)(void);void (*playGame)(void);
}GirlFriend_t;void eat(void)
{cout<<"eat"<<endl;
}
void playGame(void)
{cout<<"playGame"<<endl;
}int main()
{//结构体的方式GirlFriend_t mya ={"如花",28,166,eat,playGame};mya.eat();mya.playGame();return 0;
}

练习2:使用C++结构体实现面向对象

#include<iostream>using namespace std;//女朋友是一个整体  对象
//关于对象:   1、属性   关于 这个对象的特征的描述  年龄  姓名    变量
//            2、行为   吃饭、打游戏  玩 、睡觉....             函数 
typedef struct GirlFriend{//属性char name[256];int age;int money;//行为void eat(){printf("[%s] 我正在吃饭....\n",this->name);}void player(){printf("[%s]别说了,上号...\n",this->name);}int getAge(){return this->age;}}GirlFriend_t; int main(){GirlFriend_t s1 = {"zhang3",22};GirlFriend_t s2 = {"ruhua",22};s1.eat();s2.eat();cout<<s1.getAge()<<endl;
}

二、类与对象

1、概念
对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

对象的载体:人、电脑、风扇、桌子、游戏、旅游、棋盘系统.....
对象的描述:特征/属性--变量--数据成员 功能/方法--函数--函数成员

类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是 类,类的具体化(实例化)就是对象,类实际上就是一种数据类型 。

女朋友1  ----有属性(身高、体重、姓名..) 有行为(吃饭、睡觉、打游戏、生气.)
女朋友2  ----有属性(身高、体重、姓名..) 有行为(吃饭、睡觉、打游戏、生气.)
女朋友3  ----有属性(身高、体重、姓名..) 有行为(吃饭、睡觉、打游戏、生气.------女朋友123 是具体的事物(),也就是对象
------提炼出共同点,抽象出一个类:GirlFriend类

2、设计和使用一个类

1) 找出对象 归类 —时间类
2) 抽象:(提炼共同点)
特征/属性:时 分 秒
功能/方法:显示时间 设置时间
3) 封装
把对象的属性和服务结合成一个独立的系统单元。尽可能屏蔽对象的内部细节。对外形成一个边界(或者说一道屏障), 只保留有限的对外接口使之与外部发生联系。
4) 实例化对象
定义一个类的对象,通过对象调用类中的成员
3、类的简单设计格式

class 类名{ 类的特征(属性) 成员变量 类的行为(功能) 成员方法, 函数 
}

比如:设计一个女朋友类

class GirlFriend{//属性--数据成员char name[256];int age;float score;//行为--函数成员void print(){cout<<name<<age<<score<<endl;}int playGame(){cout<<"playGame"<<endl;}int study(){cout<<"study"<<endl;}
};

4、结构体与类
在这里插入图片描述
5、类的成员权限
成员的性质由关键字public、protected、private 决定 ,如果在进行类的声明时不写上面这些关键字,默认都是私有的。

public     公有         公有段的成员是提供给外部的接口 
protected  保护         保护段成员在该类和它的派生类中可见 
private    私有         私有段成员仅在类中可见 
class  类名
{
public://公共权限        类的外部 类内部   类的派生类  友元protected://保护权限    类内部   类的派生类  友元private://私有权限    类内部    友元};

比如:

//类的实例化,也就是创建一个类的对象
GirlFriend mygirl1;
mygirl1.playGame(); //访问错误,因为类中默认的权限是私有的,不能在类的外部访问私有成员

所以应该给成员添加权限:

//设计一个类
class GirlFriend{
public://行为--函数成员void print(){cout<<name<<age<<score<<endl;}int playGame(){cout<<"playGame"<<endl;}int study(){cout<<"study"<<endl;}
private://属性--数据成员char name[256];int age = 20;  //C++98标准不支持这种写法 C++11才支持float score;    
};

6、如何访问类中的成员

  • 类内部的成员访问其它成员,直接访问
  • 类的外部 访问类的成员,通过对象才能访问

7、特点
1)类的属性变量成员一般设置为私有权限,可以自己控制属性的读写权限,确保数据的安全性。还可以将用户传入的数据进行检测。

8、类的实例化

1. 静态分配内存
GirlFriend mygirl1;    
mygirl1.playGame();

9、类的成员内部声明,外部定义

//设计一个类
class GirlFriend{
public://行为--函数成员void print();int playGame();int study(){cout<<"study"<<endl;}
private://属性--数据成员char name[256];int age = 20;  //C++98标准不支持这种写法 C++11才支持float score;    
};
//在类的外部进行定义
void GirlFriend::print()
{cout<<name<<age<<score<<endl;
}
int GirlFriend::playGame()
{cout<<"playGame"<<endl;
}

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

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

相关文章

LLM大模型工程师面试经验宝典--进阶版2(2024.7月最新)

目录 1 大模型怎么评测&#xff1f; 2 大模型的honest原则是如何实现的&#xff1f;模型如何判断回答 的知识是训练过的已知的知识&#xff0c;怎么训练这种能力&#xff1f; 3 如何衡量大模型水平&#xff1f; 4 大模型评估方法 有哪些&#xff1f; 5 大模型评估工具 有哪…

解锁数据资产的无限潜能:深入探索创新的数据分析技术,挖掘其在实际应用场景中的广阔价值,助力企业发掘数据背后的深层信息,实现业务的持续增长与创新

目录 一、引言 二、创新数据分析技术的发展 1、大数据分析技术 2、人工智能与机器学习 3、可视化分析技术 三、创新数据分析技术在实际应用场景中的价值 1、市场洞察与竞争分析 2、客户细分与个性化营销 3、业务流程优化与风险管理 4、产品创新与研发 四、案例分析 …

Python处理Excel文件的实用技巧使用详解

概要 在数据分析和处理的过程中,Excel 是一种广泛使用的数据存储和交换格式。Python 提供了多个强大的库来处理 Excel 文件,如 pandas、openpyxl 和 xlrd 等。本文将详细介绍如何使用这些库进行 Excel 文件的常用操作,包括读取、写入、修改和格式化等。 使用 pandas 处理 E…

仪器校准的概念与定义,计量校准是什么?

仪器校准的定义&#xff0c;在之前所颁布的《国际计量学词汇 基础和通用概念及相关术语》文件中&#xff0c;已经有了明确说明&#xff0c;而该文件做了修改以后&#xff0c;在后续新的定义中&#xff0c;仪器校准具体被分为两部分&#xff0c;第一步是将被计量仪器和计量校准的…

数据库测试数据准备厂商 Snaplet 宣布停止运营

上周刚获知「数据库调优厂商 OtterTune 宣布停止运营」。而今天下班前&#xff0c;同事又突然刷到另一家海外数据库工具商 Snaplet 也停止运营了。Snaplet 主要帮助开发团队在数据库中生成仿真度高且合规的测试数据。我们在年初还撰文介绍过它「告别手搓&#xff01;Postgres 一…

vue3中若v-model绑定的响应字段出现三级,该如何实现rules验证规则

比如以下内容&#xff1a; 配置的rules内容 const rulesref({title:[{required:true,message:"请输入标题",trigger:"blur"},{max:50,message:"最大不能超过256个字",trigger:"blur"}],Category:[{required:true,message:"请选择…

竹云位居首位 |沙利文《2024年全球及中国IAM中间件市场报告》正式发布

7月2日&#xff0c;弗若斯特沙利文&#xff08;Frost & Sullivan&#xff0c;以下简称“沙利文”&#xff09;正式发布《2024年全球及中国IAM中间件市场报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;从行业背景、市场规模、驱动因素、发展趋势等维度阐述当前…

让采购和工程师们既爱又恨的任务——BOM

在项目研发与生产过程中&#xff0c;有一个常常让采购经理和工程师们既爱又恨的任务&#xff0c;那就是整理BBOMB。BOM作为连接设计与制造的桥梁&#xff0c;其重要性不言而喻&#xff0c;它详细列出了产品构成所需的所有零部件、材料及其规格、数量&#xff0c;是成本估算、采…

自然语言处理:第四十一章 解读大模型的参数

文章链接:7B&#xff1f;13B&#xff1f;175B&#xff1f;解读大模型的参数 (qq.com) 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新…

C++ | Leetcode C++题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret;} };

清新简约卡片风格蓝紫渐变色短视频苹果CMS模板

首途第三十三套清新简约卡片风格蓝紫渐变色短视频模板&#xff0c;一套苹果CMSV10主题。 这套主题是简约风格&#xff0c;以纯洁的白色和深邃的紫色为主色调&#xff0c;为您提供了一种清新、时尚的浏览体验。 在这个简洁而美丽的界面中&#xff0c;您可以轻松畅享各种精彩短…

KUKA机器人不同运行方式

KUKA机器人有以下四种运行方式&#xff1a; 1、手动慢速运行&#xff08;T1&#xff09; 2、手动快速运行&#xff08;T2&#xff09; 3、自动运行&#xff08;AUT&#xff09; 4、外部自动运行&#xff08;AUT EXT&#xff09; 将示教器上的钥匙向右旋转&#xff0c;就会…

对原生textarea加上:当前输入字数/最大输入字数

源码: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Textarea Character Counter with Dragga…

python中对于函数中参数的详解

函数中参数时候很重要的&#xff0c;不仅仅是我们常用的一些必填参数&#xff0c;可缺省参数&#xff0c;还包括一些&#xff0c;关键字参数等&#xff0c;这边主要是自己一些学习心得~ 1.必填参数 顾名思义必填参数就是调用函数的时候必须传入的参数 def func1(a)&#xff1…

20240701给NanoPi R6C开发板编译友善之臂的Android12系统

20240701给NanoPi R6C开发板编译友善之臂的Android12系统 2024/7/1 14:19 本文采取这个模式编译&#xff1a;11.6.3 编译Android Tablet版本(首次编译) echo "ROCKCHIP_DEVICE_DIR : device/rockchip/rk3588/nanopi6" > .rockchip_device.mk # export INSTALL_GAP…

日志以及日志封装

日志 输出日志信息 import logging# 调用 指定级别 输入日志信息 logging.debug("this is a debug") logging.info("this is a info") logging.warning("this is a warning") logging.error("this is a error") logging.critical(&qu…

阿里云再次突发故障,高可用形同虚设?

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

【UE 网络】多人游戏开发时应该如何区分客户端逻辑和服务端逻辑 入门篇

目录 0 引言1 服务器和客户端逻辑1.1 服务器职责1.2 客户端职责 2 函数会在客户端执行还是服务端&#xff1f;2.1 只在客户端执行的函数RepNotifyClient RPCMulticast RPC 2.2 只在服务端执行的函数GameModeServer RPC 2.3 在两端都可以执行的函数GetNetMode() 和 HasAuthority…

用C#的MediaDevices程序集打开MTP设备(用usb线连接的手机)的文件夹

一、任务描述 1、可以访问MTP设备的桌面程序。 MTP设备&#xff1a;支持媒体传输协议(MTP)的设备&#xff0c;MTP简单来说就是一种PC与其他设备相连的一种协议&#xff0c;智能手机、平板电脑、数码相机等可以通过 USB 连接到电脑&#xff0c;并通过 MTP 协议传输媒体文件。点…

PLC_博图系列☞F_TRIG:检测信号下降沿

PLC_博图系列☞F_TRIG&#xff1a;检测信号下降沿 文章目录 PLC_博图系列☞F_TRIG&#xff1a;检测信号下降沿背景介绍F_TRIG&#xff1a; 检测信号下降沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 F_TRIG 背景介绍 这是一篇关于PLC编程的文章&a…