如何选择值或指针或引用?
当我在 C++ 中编码时,我不知道什么时候选择每个?
选择时是否有一个优先级或规则?
You use a value when
You use pointers or references when
You decide between a pointer and a reference using a simple rule: if there are situations where your referenced object does not exist, or the same variable must refer to different objects throughout its lifetime, use a pointer; otherwise, use a reference.
我会尝试,只是为了让其他人纠正我:
如果它真的不能为null,并且您不想存储它,并且它不是原始的,请使用引用;如果您不需要更改它,请使用 const 引用。
否则,如果您需要更改或存储它,请使用指针(更好:智能指针)。如果它不是原始的,请使用const
指针。
如果您需要运行时多态性,则不得使用按值传递。
否则,使用按值传递。用int
而不用const int&
。
如果您正在编写模板,请记住按值传递(或以任何方式复制)意味着将工作复制构造函数作为类型的约束。如果类型是数组(或字符串文字),引用可能会更奇怪。
我将简要总结一下我认为关于选择从任意 T 派生的类型的良好做法。
template <typename _T>
void CALLED (_T B) { /* _STUFF_ */ }
template <typename T>
void CALLER (void)
{
T A;
typedef T TYPE;
CALLED<TYPE>(A);
}
TYPE 可以是以下之一:
T
(值类型),T&
(参考),T
const & (引用 const T),T*
(指针),T const *
(指向 const T 的指针),T const * const
(指向 const T 的 const 指针),T * const
(指向非常量 T 的 const 指针)注意:对于指针类型,调用语句将更改为CALLED<TYPE>(&A);
.
CALLED()
打算有一个有效的对象这应该是某种“默认”。
保证保存 A(^) | 没有 | 是的 | 是的 | 是的 | 更改 B 所需 | 是的 | 是的 | 没有 | 没有 | 大小(T) > 大小(T*) | 是/否 | 是/否 | 是的 | 没有 | -------------------------------------------------- ---------------------- 类型(B)| T& | T | T 常量 & | 常量 |
(^):此行中的“否”也可能意味着您想故意更改 A。如果不是这种情况,我将只描述保证 A 守恒的最佳类型。
CALLED()
可以(并且确实)描述它是否得到一个有效的对象由于将引用绑定到 NULL 不是很聪明,而且值参数总是会尝试获取对象,因此我们必须在这里坚持使用指针。由于按值调用在这里没有多大意义,因此 T 的大小无关紧要。
保证保存 A(=*B) | 没有 | 是的 | 是的 | 没有 | B | 变更 没有 | 没有 | 是的 | 是的 | -------------------------------------------------- --------------------------------- 类型 | T* 常量 | T 常量 * 常量 | T 常量 * | T* |