2

如何选择值或指针或引用?

当我在 C++ 中编码时,我不知道什么时候选择每个?

选择时是否有一个优先级或规则?

4

3 回答 3

6

You use a value when

  • Your data member is principal, i.e. not a copy of something else or a reference to another value
  • You would like an independent copy that you would like to modify
  • The object is much smaller than the pointer/reference, and you need many of them

You use pointers or references when

  • The object is too large to copy efficiently
  • The object needs to be modifiable in some other part of the code

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.

于 2013-05-16T01:17:09.503 回答
1

我会尝试,只是为了让其他人纠正我:

如果它真的不能为null,并且您不想存储它,并且它不是原始的,请使用引用;如果您不需要更改它,请使用 const 引用。

否则,如果您需要更改或存储它,请使用指针(更好:智能指针)。如果它不是原始的,请使用const指针。

如果您需要运行时多态性,则不得使用按值传递。

否则,使用按值传递。用int而不用const int&

如果您正在编写模板,请记住按值传递(或以任何方式复制)意味着将工作复制构造函数作为类型的约束。如果类型是数组(或字符串文字),引用可能会更奇怪。

于 2013-05-16T01:13:56.977 回答
0

我将简要总结一下我认为关于选择从任意 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&(参考),
  • Tconst & (引用 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* |
于 2013-05-16T01:22:03.970 回答