紧接着上面学到的指针和域名空间我们继续逛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直接传送到云端谢了大量代码变量抄写,这可真的非常痛苦。除此之外这些数据就写在一片连续的内存中。
第二点是,你将会失去前面说的链接功能,本地的变量修改了,你的指针完全能抄写回来,因为他是一种链接记着吗