目錄
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 函數沒有什么不同,它的作用就是讓我們代碼更干凈,看起來更好看,當你處理很多代碼時,這是一個巨大的優勢,因為你有越多的代碼,情況就越復雜,就越需要有這樣的代碼來保持代碼整潔。
后話
這就是類的基本概念了,它允許我們將變量分組到一個類型中并為這些變量添加功能,因為如果你再回看一下這些代碼,我們真正做的是在一個類型中定義了三個變量,我們還有一個處理這些變量的函數。當然這個函數可以做其他任何事情,但它的要點是,我們有數據和處理這些數據的函數,這就是所謂的類了。