P9 C++类

2023-11-25 00:01
文章标签 c++ p9

本文主要是介绍P9 C++类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

01 类是什么

02 如何创建类

03 方法

后话


本期我们要讲的是 C++ 中的类。

我们终于讲到了面向对象编程,这是一种非常流行的编程方式,面向对象编程实际上只是一种你可以采用的编写代码的方式,其他语言例如 C#、Java 这些主要是面向对象的语言,事实上,用这些语言你真的不能写任何其他类型的代码,尽管你也可以尝试这样做,因为最终这些语言都是面向对象的语言,C++ 有点不同,因为它并没有强加给你一种特定的风格。

C 语言实际上并不支持面向对象编程,因为为了面向对象编程,你需要有一些概念,比如类和对象,这些东西 C 语言没有,如果你想使用面向对象的话 C++ 会添加所有这些功能。

01 类是什么

简单地说,类只是对数据和功能组合在一起的一种方法

例如,在一个游戏中,我们可能想要一些代表角色的东西,那么我们需要什么样的东西来代表一个角色呢?我们当然需要一些数据,例如,角色在游戏中的位置,角色可能拥有的某些属性,角色移动的速度,我们可能还需要一些 3D 模型,代表角色的屏幕形象。所有这些数据都需要存储在某个地方,实际操作中,我们可以为所有这些创建变量,让我们来看看它会是什么样子。

#include <iostream>
using namespace std;int main() 
{int x, y;int speed;return 0;
}

我们想要创建一个角色,然后想要一个角色位置以及它的速度,这些都是整数。你可能发现这有点乱了,因为这些名字太普通了,你可能想写成 PlayerX、 PlayerY,speed 改成 PlayerSpeed,哪怕是这样,还是有点乱。

尤其是当我们的游戏有 2 个角色时,你就不得不先复制,然后改成 PlayerX0、PlayerX1 等。

这样的话代码太糟糕了,现在还只是两个角色,如果三个四个呢?

#include <iostream>
using namespace std;int main() 
{int PlayerX0, PlayerY0;int playerspeed0 = 0;int PlayerX1, PlayerY1;int playerspeed1 = 0;return 0;
}

你当然可以使用数组,但其实问题重点还是一样的,它们只是一堆没有组合在一起的变量,他们是无组织的,只是被放在我们的代码中,这不是一个好方式。

另一个很好的例子可以说明为什么这很烦人,我想写一个函数来 move 角色,例如下面这样。

#include <iostream>
using namespace std;int Move(int x, int y,int speed) 
{return 0;
}int main() 
{int PlayerX0, PlayerY0;int playerspeed0 = 0;int PlayerX1, PlayerY1;int playerspeed1 = 0;return 0;
}

看起来更乱了,是吧。

所有这一切都变成了如此多的代码,难以维护,非常混乱,所以我们要做的就是通过使用类来简化它。

02 如何创建类

我们可以创建一个叫做 Player 类,它包含了所有的数据,我们想要把所有的变量变成一种类型。

在上面的代码中,我们创建一个名为 Player 的类,通过使用关键字 class,然后给它一个名字来实现。这个名字必须是唯一的,因为 class 是类型,这里是创建一个新的变量类型,然后是左右花括号,就像定义函数那样,注意末尾需要一个分号;在花括号里面,我们指定了我们需要的所有变量。

ok,我们创建了一个全新的类叫 Player,本质上它是一种类型,如果我们开始使用 Player 类,可以把它当作其他变量来创建。

我们给一个新变量命名为 player,类型是 Player。

由类类型构成的变量称为对象,新的对象变量称为实例,我们在这里所做的是实例化了一个 Player 对象,因为我们已经为那个 Player 类型创建了一个新实例。

如果我们想设置这些变量,如果你有一点概念基础的话可能会这样使用。

然而如果我们现在尝试编译,会得到一个错误。告诉我们 player 不能访问在类 Player 中声明的私有成员

这是因为 “可见性” 的原因,当你创建一个新类时,您可以选择指定类中的内容的可见性,默认情况下,类中所有东西都是私有的,这意味着只有类中的函数才能访问这些变量。然而,我们希望能够从 main 函数中访问这些变量时,我们需要做的是把它设为 public(公有的)。

public 意味着我们可以在类之外的任何地方访问这些变量。我们会在以后的内容中更多地讨论可见性,现在先不讲这个。

现在编译,程序就没有问题了。

现在我们实现了第一个目标,已经彻底清理了代码,把所有的变量都放在了一个地方,这些变量集合可以代表一个 player,我们把它们恰当地分组了。

03 方法

现在我们有了这些数据,我们想让 Player 做一些事情,例如移动,所以要写一个函数来改变 X 和 Y 变量的值,我们怎么做呢?我们可以把它写成单独的函数。

#include <iostream>
using namespace std;class Player 
{
public:int playerX;int playerY;int playerSpeed;
};void movePlayer(int x, int y,Player& player)
{player.playerX += player.playerSpeed *x;player.playerY+= player.playerSpeed*y;
}int main() 
{Player player;move(1, -3,player);return 0;
}

这个函数的参数我们通过引用传递给它一个想要被移动的 Player,因为我们要修改 Player 对象。所以还要取 xa 和 ya,也就是我们在 X 轴和 Y 轴上 player 移动的距离。

我们现在试着调用这个函数。

没有问题。

我们可以做得更好一点,之前我说过,类实际上可以包含函数,这意味着我们可以将 Move 函数移动到类中,类内的函数被称为 方法 (method) 。

#include <iostream>
using namespace std;class Player 
{
public:int playerX;int playerY;int playerSpeed = 2;   // speed移动速度void Move(int& player_X, int& player_Y){player_X += playerSpeed*player_X;player_Y += playerSpeed*player_Y;}
};int main() 
{Player player;player.playerX = 10;   //X轴player.playerY  = 5;  //Y轴//move(1, -3,player);player.Move(player.playerX,player.playerY);cout<<player.playerX<<endl;cout<<player.playerY<<endl;return 0;
}

我们还做了一些修改,因为这个函数已经在类中了,所以不需要传入 player 对象了,因为它已经在 Player 对象中了,所以我删除了里面相关的内容,这样我们已经简化了我们的代码。

上面代码主函数的代码依旧还是有些复杂,我们还可以进行修改,也不想让角色的X,Y轴被随意调用,所以我们可以通过private私有化下XY,如果要修改角色的X,Y点则需要通过公有函数setPlaer(),代码如下

#include <iostream>
using namespace std;class Player 
{
//私有的变量
private:int playerX;   //x轴int playerY;  //y轴int playerSpeed = 2;   // speed移动速度
public:void Move(int& player_X, int& player_Y){player_X += playerSpeed*player_X;player_Y += playerSpeed*player_Y;}void Move()  //重载函数{playerX = playerSpeed*playerX;playerY = playerSpeed*playerY;}void setPlayer(int x, int y, int speed)   //设置人物属性{playerSpeed = speed;playerX = x;playerY = y;}
};int main() 
{Player player;player.setPlayer(12,-4,5);   //设置人物的X轴,Y轴,移动速度player.Move();   //需先设置人物属性才能能进行有效移动,否者按照上一次数据进行移动//player.Move(player.playerX,player.playerY);return 0;
}

好了,每个 Player 对象都有了自己的Move 函数,当我们为指定的 Player 对象调用 Move 时,这个 Player 对象将会移动,这与 Player 类之外的 Move 函数没有什么不同,它的作用就是让我们代码更干净,看起来更好看,当你处理很多代码时,这是一个巨大的优势,因为你有越多的代码,情况就越复杂,就越需要有这样的代码来保持代码整洁。

后话

这就是类的基本概念了,它允许我们将变量分组到一个类型中并为这些变量添加功能,因为如果你再回看一下这些代码,我们真正做的是在一个类型中定义了三个变量,我们还有一个处理这些变量的函数。当然这个函数可以做其他任何事情,但它的要点是,我们有数据和处理这些数据的函数,这就是所谓的类了。

这篇关于P9 C++类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422769

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(