我使用以下方法前缀来表示对象所有权。所有权意味着删除的责任。
Y.take_ZZZ(x)
调用者将 x 的所有权授予 Y,调用者不得进一步访问 x。(因为 Y 甚至可以立即删除 x)。
Y.own_ZZZ(x)
类似于采取;调用者将 x 的所有权授予 Y,但调用者可能会继续引用 x 并期望 Y 不会立即删除 x(至少只要存在 Y 并且假设 Y 将至少存在于调用者知道的整个上下文中)是)。通常 Y 不会删除 x,直到 Y 被销毁(尽管 Y 可能会转移所有权)。
Y.know_ZZZ(x)
调用者提供了一个指向 x 的指针/引用(调用者自己可能拥有也可能不拥有 x),但 Y 不拥有 x 的所有权。Y 会期望 x 会一直存在。
x = Y.provide_ZZZ()
x 是 Y 拥有的对象。Y 返回对对象的引用 (&),以便调用者可以“知道”它。对象在需要之前可能最初是空指针,Y 可能在需要之前不会创建对象。无论 x 是否是动态分配的,对调用者都是隐藏的,Y 会做任何需要的事情来返回对要提供的对象实例的引用。只要 Y 存在,x 就会保持实例化。有时我会提供一个相应的方法 Y.done_with_ZZZ(x) 以便调用者可以告诉 Y 它已经完成可以删除 x。
x = Y.give_ZZZ()
Y 将 x 让给调用者并且不再引用它。然后调用者将拥有 x 并负责将其删除或将其提供给另一个对象。
x = Y.lend_ZZZ()
Y 向调用者提供指向 x 的引用/指针(与 know_ZZZ 相反) Y 保留所有权。(类似于提供,但 Y 不实例化 X,因此它要么有 x 并返回引用(指针),要么没有并返回 null。
x = Y.check_out_ZZZ() and Y.check_in_ZZZ(x)
通过结帐,Y 为调用者提供对 x 的独占访问权限,直到调用者将其签入。
x = Y.create_ZZZ()
Y 将创建 x 并立即将其交给调用者(工厂函数)。
所有权可以通过使用智能指针进一步加强,但通常我使用这些命名约定而不使用智能指针,除非有更复杂的所有权事务序列,所有权范围不是很本地化,或者对象将被多个对象引用(已知)。