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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过docker overlay2 目录名查找占用磁盘空间最大的容器名和容器ID

有时候经常会有个别容器占用磁盘空间特别大&#xff0c; 这个时候就需要通过docker overlay2 目录名查找占用磁盘空间最大的容器名和容器ID&#xff1a; 1、 首先进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多 [rootPPS-97-8-ALI-HD1H overlay2]# cd /var/lib/doc…

Vue 全局状态管理新宠:Pinia实战指南

文章目录 前言全局状态管理基本步骤&#xff1a;pinia 前言 随着Vue.js项目的日益复杂&#xff0c;高效的状态管理变得至关重要。Pinia作为Vue.js官方推荐的新一代状态管理库&#xff0c;以其简洁的API和强大的功能脱颖而出。本文将带您快速上手Pinia&#xff0c;从安装到应用&…

【C语言】bool 关键字

在C语言中&#xff0c;bool类型用于表示布尔值&#xff0c;即真或假。C语言本身在标准库中并未提供布尔类型&#xff0c;直到C99标准引入了stdbool.h头文件。该头文件定义了bool类型&#xff0c;以及两个常量&#xff1a;true和false。在此之前&#xff0c;通常使用整数来表示布…

[方法] 为Cinemachine添加碰撞器

选中场景中的Cinemachine物体&#xff0c;在 Inspector 面板的最下方单击 Add Extension 下拉框&#xff0c;选择 CinemachineCollider。 之后在添加的碰撞器组件中选择要与之碰撞的层&#xff08;Collide Against&#xff09;和忽略的层&#xff08;Transparent Layers&#x…

配置atuin记录

https://atuin.sh/ 运行 curl --proto https --tlsv1.2 -LsSf https://setup.atuin.sh | sh报错 $ curl --proto https --tlsv1.2 -LsSf https://setup.atuin.sh | sh curl: (77) error setting certificate verify locations:CAfile: /etc/ssl/certs/ca-certificates.crtCAp…

2025中国淄博化工展|淄博化工技术展|淄博化工装备展

CTEE2025第九届中国&#xff08;淄博&#xff09;化工技术装备展览会 时间&#xff1a;2025年5月16-18日 地点&#xff1a;山东淄博国际会展中心 主办单位:山东省机械工业科学技术协会 青岛蓝博国际会展有限公司 众所周知&#xff0c;山东省是我国化工大省。2023年上半年&am…

Unity 动画事件

Unity中的动画事件是一种在动画播放过程中触发自定义行为的方法。动画事件允许开发者在动画的特定时间点执行代码&#xff0c;例如播放声音、改变游戏状态或触发其他动画。以下是使用Unity动画事件的一些关键点&#xff1a; 动画事件的创建&#xff1a;在Unity的Animation窗口…

Linux kfence使用与实现原理

0 背景 为了更好的检测linux kernel中内存out-of-bounds、mem-corruption、use-after-free、invaild-free等问题&#xff0c;调研了kfence功能&#xff08;该功能在linux kernel 5.12引入&#xff09;&#xff0c;帮助研发更好的分析与定位这类内存错误的问题。 一、kfence介…

【Unity 人性动画的复用性】

Unity的动画系统&#xff0c;通常称为Mecanim&#xff0c;提供了强大的动画复用功能&#xff0c;特别是针对人型动画的重定向技术。这种技术允许开发者将一组动画应用到不同的角色模型上&#xff0c;而不需要为每个模型单独制作动画。这通过在模型的骨骼结构之间建立对应关系来…

V Rising夜族崛起的管理员指令大全

使用方法&#xff1a; 如果没有启用控制台需要先启用控制台 打开游戏点击选项&#xff08;如果在游戏内点击ESC即可&#xff09;&#xff0c;在通用页面找到启用控制台&#xff0c;勾选右边的方框启用 在游戏内点击键盘ESC下方的波浪键&#xff08;~&#xff09;使用控制台 指…

JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI

JAVA妇产科专科电子病历系统源码&#xff0c;前端框架&#xff1a;Vue&#xff0c;ElementUI孕产妇健康管理信息管理系统是一种将孕产妇健康管理信息进行集中管理和存储的系统。通过建立该系统&#xff0c;有助于提高孕产妇健康管理的效率和质量&#xff0c;减少医疗事故发生的…

LSH算法:高效相似性搜索的原理与Python实现I

局部敏感哈希&#xff08;LSH&#xff09;技术是快速近似最近邻&#xff08;ANN&#xff09;搜索中的一个关键方法&#xff0c;广泛应用于实现高效且准确的相似性搜索。这项技术对于许多全球知名的大型科技公司来说是不可或缺的&#xff0c;包括谷歌、Netflix、亚马逊、Spotify…

【你也能从零基础学会网站开发】理解DBMS数据库管理系统架构,从用户到数据到底经历了什么

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 其实前面我们也…

最新CRMEB商城多商户java版源码v1.6版本+前端uniapp

CRMEB 开源商城系统Java版&#xff0c;基于JavaVueUni-app开发&#xff0c;在微信公众号、小程序、H5移动端都能使用&#xff0c;代码全开源无加密&#xff0c;独立部署&#xff0c;二开很方便&#xff0c;还支持免费商用&#xff0c;能满足企业新零售、分销推广、拼团、砍价、…

Monkey测试

Monkey测试是一种自动化测试技术&#xff0c;它通过模拟用户在设备上的随机操作&#xff0c;来对应用程序进行压力测试。它的目的是测试软件的稳定性和健壮性。 Monkey测试有以下几个特点&#xff1a; 随机输入&#xff1a; Monkey测试不需要编写详细的测试用例&#xff0c;只…

【博主推荐】HTML5实现简洁好看的个人简历网页模板源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 工作经验界面1.4 学习教育界面1.5 个人技能界面1.6 专业特长界面1.7 朋友评价界面1.8 获奖情况界面1.9 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c…

怎么把录音转文字?推荐几个简单易操作的方法

在小暑这个节气里&#xff0c;炎热的天气让人分外渴望效率up&#xff01;Up&#xff01;Up&#xff01; 对于那些在会议或课堂中急需记录信息的朋友们&#xff0c;手写笔记的速度往往难以跟上讲话的节奏。此时&#xff0c;电脑录音转文字软件就像一阵及时雨&#xff0c;让记录…

中国网络安全审查认证和市场监管大数据中心数据合规官CCRC-DCO

关于CCRC-DCO证书的颁发机构&#xff0c;它是由中国网络安全审查认证与市场监管大数据中心&#xff08;简称CCRC&#xff09;负责。 该中心在2006年得到中央机构编制委员会办公室的批准成立&#xff0c;隶属于国家市场监督管理总局&#xff0c;是其直辖的事业单位。 依据《网络…

Rust学习笔记007:Trait --- Rust的“接口”

Trait 在Rust中&#xff0c;Trait&#xff08;特质&#xff09;是一种定义方法集合的机制&#xff0c;类似于其他编程语言中的接口&#xff08;java&#xff09;或抽象类(c的虚函数)。 。Trait 告诉 Rust 编译器: 某种类型具有哪些并且可以与其它类型共享的功能Trait:抽象的…

深层神经网络

深层神经网络 深层神经网络 深度神经网络&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;可以理解为有很多隐藏层的神经网络&#xff0c;又被称为深度前馈网络&#xff08;DFN&#xff09;&#xff0c;多层感知机&#xff08;Multi-Layer perceptron&#xff0c…