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 函數沒有什么不同,它的作用就是讓我們代碼更干凈,看起來更好看,當你處理很多代碼時,這是一個巨大的優勢,因為你有越多的代碼,情況就越復雜,就越需要有這樣的代碼來保持代碼整潔。

后話

這就是類的基本概念了,它允許我們將變量分組到一個類型中并為這些變量添加功能,因為如果你再回看一下這些代碼,我們真正做的是在一個類型中定義了三個變量,我們還有一個處理這些變量的函數。當然這個函數可以做其他任何事情,但它的要點是,我們有數據和處理這些數據的函數,這就是所謂的類了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167472.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

白嫖CTG4.0

大家好&#xff0c;到點了我來給各位大佬獻策CTG&#xff0c;不是花錢買不起&#xff0c;而是免費更有性價比&#xff0c;哈哈哈不調侃了我們自此開始正文&#xff0c;咱們主打的就是一個分享是一種態度 當然我更希望大家支持國產對國產有自己的信心&#xff08;文心一言&…

Git常用命令詳細總結,更適合中國寶寶體質

文章目錄 代碼倉庫創建倉庫1.進入需要創建代碼庫的文件夾2.創建/切始化倉庫3.關聯遠程倉庫拉取遠程倉庫到本地 添加文件到倉庫1.查看工作區狀態2.添加文件到暫存區3.提交到本地倉庫4.對比工作區文件變化 倉庫配置1.配置全局用戶名和郵箱2.配當前倉庫用戶名和郵箱3.查看Git全局配…

Selenium中常用的JS操作總結

? 目錄 前言&#xff1a; JS相關操作 JS Xpath定位 獲取單個元素 獲取元素集合 文本輸入 獲取坐標 獲取瀏覽器窗口的內部高度 獲取瀏覽器窗口的內部寬度&#xff1b; 坐標計算 設置樣式 設置窗口大小 類數組對象arguments JQuery選擇器 jQuery 選擇器 jQuery …

多模態——使用stable-video-diffusion將圖片生成視頻

多模態——使用stable-video-diffusion將圖片生成視頻 0. 內容簡介1. 運行環境2. 模型下載3. 代碼梳理3.1 修改yaml文件中的svd路徑3.2 修改DeepFloyDataFiltering的vit路徑3.3 修改open_clip的clip路徑3.4 代碼總體結構 4. 資源消耗5. 效果預覽 0. 內容簡介 近期&#xff0c;…

Linux上安裝Redis

案例中Linux版本為CentOS7.9&#xff0c;安裝目錄為 /root/software/ 1、使用 wget 命令從官網下載安裝包 wget https://github.com/redis/redis/archive/7.2.3.tar.gz2、解壓縮 tar -xzf 7.2.3.tar.gz3、進入解壓后的目錄 cd redis-7.2.34、 編譯和安裝Redis make make i…

npm中,你不了解的.npmrc文件

原文鏈接&#xff1a;npm中&#xff0c;你不了解的.npmrc文件 寫在前面 對于寫JS的程序員來說&#xff0c;可能沒有人不知道npm&#xff0c;但是有些同學對他的配置文件(即.npmrc文件)并不了解。結合我的學習心得&#xff0c;寫一篇博客跟大家分享一些該配置文件的知識。 .np…

理解CLIP模型

1.簡介 學習深度學習必看CLIP&#xff01;論文鏈接arxiv.org/pdf/2103.00020v1.pdf。 簡單來說就是傳統的分類任務被用來預測指定的類別&#xff0c;有監督訓練限制了模型的通用性和可用性&#xff0c;并且需要帶有標簽的數據來訓練&#xff0c;該篇論文就想直接從原始文本中…

Navicat 技術指引 | 適用于 GaussDB 的用戶權限設置

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

Spring 七大組件

文章目錄 Spring 七大組件 Spring 七大組件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式組織和管理Java應用中的各個組件及其關系。Spring使用BeanFactory來產生和管理Bean&#xff0c;它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式…

(Matalb分類預測)GA-BP遺傳算法優化BP神經網絡的多維分類預測

目錄 一、程序及算法內容介紹&#xff1a; 基本內容&#xff1a; 亮點與優勢&#xff1a; 二、實際運行效果&#xff1a; 三、部分代碼&#xff1a; 四、本文代碼數據說明手冊分享 一、程序及算法內容介紹&#xff1a; 基本內容&#xff1a; 本代碼基于Matalb平臺編譯&am…

Flink Flink中的分流

一、什么是分流 所謂“分流”&#xff0c;就是將一條數據流拆分成完全獨立的兩條、甚至多條流。也就是基于一個DataStream&#xff0c;定義一些篩選條件&#xff0c;將符合條件的數據揀選出來放到對應的流里。 二、基于filter算子的簡單實現分流 其實根據條件篩選數據的需求…

面了一個4年經驗的測試工程師,自動化都不會也要15k,我也是醉了····

&#x1f4e2;專注于分享軟件測試干貨內容&#xff0c;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;交流討論&#xff1a;歡迎加入我們一起學習&#xff01;&#x1f4e2;資源分享&#xff1a;耗時200小時精選的「軟件測試」資…

表單考勤簽到作業周期打卡打分評價評分小程序開源版開發

表單考勤簽到作業周期打卡打分評價評分小程序開源版開發 表單打卡評分 表單簽到功能&#xff1a;學生可以通過掃描二維碼或輸入簽到碼進行簽到&#xff0c;方便教師進行考勤管理。 考勤功能&#xff1a;可以記錄學生的出勤情況&#xff0c;并自動生成出勤率和缺勤次數等統計數…

本地緩存與分布式緩存

一、緩存的概念 在服務端編程當中&#xff0c;緩存主要是指將數據庫的數據加載到內存中&#xff0c;之后對該數據的訪問都在內存中完成&#xff0c;從而減少了對數據庫的訪問&#xff0c;解決了高并發場景中數據庫容易成為性能瓶頸的問題&#xff1b;以及基于內存的訪問速度高…

ruoyi-plus-vue部署

安裝虛擬機 部署文檔 安裝docker 安裝docker 安裝docker-compose 可能遇到的錯誤 Failed to deploy ruoyi/ruoyi-server:5.1.0 Dockerfile: ruoyi-admin/Dockerfile: Cant retrieve im age ID from build stream 安裝 vim 命令 yum install vim -y 修改文件 vim /etc/re…

flutter 無法從H5 WebView 訪問攝像頭和錄音權限

AndroidManifest.xml需要在 中添加以下權限&#xff1a; <uses-permission android:name"android.permission.INTERNET"/> <uses-permission android:name"android.permission.CAMERA" /> <uses-permission android:name"android.per…

基于Springboot的冬奧會科普平臺(有報告),Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的冬奧會科普平臺&#xff08;有報告&#xff09;&#xff0c;Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層…

線性表之鏈式表

文章目錄 主要內容一.單鏈表1.頭插法建立單鏈表代碼如下&#xff08;示例&#xff09;: 2.尾插法建立單鏈表代碼如下&#xff08;示例&#xff09;: 3.按序號查找結點值代碼如下&#xff08;示例&#xff09;: 4.按值查找表結點代碼如下&#xff08;示例&#xff09;: 5.插入節…

ELK+kafka+filebeat企業內部日志分析系統

1、組件介紹 1、Elasticsearch&#xff1a; 是一個基于Lucene的搜索服務器。提供搜集、分析、存儲數據三大功能。它提供了一個分布式多用戶能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java開發的&#xff0c;并作為Apache許可條款下的開放源碼發布…

module ‘d2l.torch‘ has no attribute ‘train_ch3‘

解決方法&#xff1a; 方法1&#xff1a; 如果沒有安裝d2l&#xff0c;請安裝 詳細步驟見安裝d2l 方法2&#xff1a; 先卸載舊的版本 pip uninstall d2l再下載新的版本&#xff0c;需要以管理員身份運行下載指令 pip install d2l0.17.5 --user完美解決&#xff01; ????…