2:瞧,這是UE4 C++


  緊接着上面學到的指針和域名空間我們繼續逛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直接傳送到雲端謝了大量代碼變量抄寫,這可真的非常痛苦。除此之外這些數據就寫在一片連續的內存中。
  第二點是,你將會失去前面說的鏈接功能,本地的變量修改了,你的指針完全能抄寫回來,因為他是一種鏈接記着嗎


  

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM