緊接着上面學到的指針和域名空間我們繼續逛Unreal 4 wiki。
1.怪形 T
在自己很早學習編程的時候看到過匈牙利表示法,記得是微軟的開發者Charles提出來的,盡管看起來很美好但是從來沒有遵循過。
其實那些前綴T就是這回道理。UE4 有自己的定義類,所以我們的標題不叫C++學習。
TArray
TSharedRef
TWeakPtr
TArray
之類,帶前綴T表示Template class,前綴能讓你輕易地區分變量名。
UE4中的T前綴變量應該讓你想起兩件東西
①一種游戲類型
②一種變量類型
當然UE4中還有T,F,U,A,I等前綴去這里看Epic's Naming Conventions
2.你的痛:指針
伙計,*和&到底是什么東西?怎么用?着實讓我頭大:S
這也是新手學習C++最難得地方了吧,但是一旦你掌握了指針你將會快樂的編寫UE4 C++了
總的來說指針既強大又危險,指針需要你成為一位勤勉的人,與之換來的將賦予你速度和力量。對,就像葵花寶典一樣。你得有揮刀的決心XD
①一個指針必須指向一個數據存儲的存儲地址
②為了獲取地址你就得使用&
FVector Location=FVector(1,2,9000);
FVector* LocationPtr;
LocationPtr=&Location;
③訪問數據前,永遠檢測你的指針
Check(LocationPtr);
或者
if(!LocationPtr)return;
你必須這樣做,因為你永遠不知道什么時候指針中存儲的值是有效的
你可以重定向
Fvector NewVector=FVector::ZeroVector;
if(LocationPtr)
{
NewVector=*LocationPtr; //重定向指針
}
if(!LocationPtr)return;
const float XValue=LocationPtr->X;
3.總結:為什么使用指針?
有很多人喜歡看總結篇,因為貌似總結篇很能講一些道理,這次我們也不例外:)
①指針能讓你獲取地址,試想一下你當前在編寫context,但是要訪問一個不是這個context的變量,地址能給你很快的傳回
②指針還能讓你獲取大量的數據,從而避免還得創建復制這一類型
③指針給你一種活鏈接,無論你的數值怎么變化,指針都無需更新因為它僅僅是一個指向。就像超級鏈接一樣,你盡管修改自己的網頁,URL給我~
Example:我們來獲取一個超級超級遠的數據
假設你有一個角色類,他是眾多銀河,子星系的星球的一部分,我們僅僅是要獲取他的盔甲,估計你會這樣作:
GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor();
上邊的訪問是不是看起來都很廢?雖然能解決問題
如果只做一次指針指代能好一點?
FArmorStruct* TheArmor=& GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor();
既然做了一次指代你就不需要再寫下面的代碼了:
GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor().Durability; GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor().Color; GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor().Size;
瞧,為了偷懶我都直接復制過來了。
這樣不僅難讀,同時又浪費CPU時間
然后你會這樣寫
if(!TheArmor) return; //永遠檢測指針
TheArmor->Durability;
TheArmor->Color;
TheArmor->Size;
上述使用了指針,你或許會問,為什么我不是用FArmorStruct ArmorVar=
GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor();
而是使用指針?
假設一下,若果有眾多數據你將會進行大量的賦值拷貝。我在寫iCLoud的時候因為不能將多object直接傳送到雲端謝了大量代碼變量抄寫,這可真的非常痛苦。除此之外這些數據就寫在一片連續的內存中。
第二點是,你將會失去前面說的鏈接功能,本地的變量修改了,你的指針完全能抄寫回來,因為他是一種鏈接記着嗎