共享引用

共享引用 是不能设置为null的共享指针。这意味着您不能创建一个空的共享引用,不能给一个共享引用赋予null值,这可以帮助您书写更加安全的、更加整洁的代码,因为你知道访问这个对象是安全的。事实上,共享引用甚至没有像共享指针那样的 IsValid() 方法,因为它们总是有效的。所以,任何可能的时候推荐您总是使用共享引用而不是共享指针。

如果您需要使用 空引用/可以设置为null值的引用,那么此时您可以使用 共享指针

声明和初始化

共享引用必须使用有效的对象进行初始化,且在声明时必须进行初始化。

创建新的共享引用的示例:

// 创建共享引用到新节点
TSharedRef<FTreeNode> NodeRef( new FTreeNode() );

永远不允许声明一个没有初始化或者赋值为NULL的共享引用:

TSharedRef<UBool> EmptyBool;            // Will not Compile!!

共享引用应用

大多数情况下,使用共享引用就和使用共享指针一样。

// 创建共享引用到新节点
TSharedRef<FTreeNode> NodeRef( new FTreeNode() );

NodeRef->ListChildren();
( *NodeRef ).ListChildren();
const FTreeNode& NodeVar = NodeRef.Get();

再次强调,主要的区别是您不能把共享引用设置为NULL:

TSharedRef<FTreeNode> Node = NULL;      // Will not Compile!!

指针和引用的转换

共享引用可以隐式地转换为共享指针,所以从一个引用转换而来的指针总是安全的,也就是,您可以给共享指针分配一个共享引用或者向一个需要共享指针的方法传入一个共享引用。

TSharedPtr<FTreeNode> SomeNodePtr = NodeRef;

然而,从指针转换为引用则可能是不安全的,所以您必须强制使用 ToSharedRef() 函数显式地执行转换。

// 明确地引用指针。如果指针无效将会断言!
NodeRef = SomeNodePtr.ToSharedRef();

和C++指针的 * 操作符类似,如果该对象无效,使用 ToSharedRef() 时将会产生断言。