我什么时候应该在C++中使用引用?

Ale*_*lex 4 c++ pointers c++03

我一直在编写C++编程,我开始怀疑规则使用引用应尽可能应用于任何地方.

这个相关的SO帖子不同,我对一种不同的东西感兴趣.

根据我的经验,参考/指针混合会混淆你的代码:

std::vector<Foo *> &x = get_from_somewhere(); // OK? reference as return value
some_func_pass_by_ref(x); // OK reference argument and reference variable
some_func_by_pointer(x[4]); // OK pointer arg, pointer value
some_func_pass_elem_by_ref(*x[5]); // BAD: pointer value, reference argument
some_func_that_requires_vec_ptr(&x); // BAD: reference value, pointer argument
Run Code Online (Sandbox Code Playgroud)

一种选择是,以取代&* constFoo &Foo * const

void some_func_by_ref(const std::vector<Foo * const> * const); // BAD: verbose!
Run Code Online (Sandbox Code Playgroud)

这样至少走遍了.和我重写功能头走了,因为所有的参数将指针......在污染代码的价格const,而不是指针运算(主要是&*).

我想知道在可能的规则下如何以及何时应用使用引用.

考虑:

  • 最小化函数原型的重写(即:哦,该死的我需要重写很多原型,因为我想将这个引用的元素放入容器中)
  • 提高可读性

    • 避免应用*转换Foo*,Foo&反之亦然
    • 避免使用过多的const使用 * const

注意:我想要的一件事是每当我打算将元素放入STL容器时使用指针(参见boost :: ref)

我认为这不是C++ 03特有的东西,但如果它们可以被反向移植到C++ 03(即:NRVO而不是移动语义),那么C++ 11解决方案就可以了.

utn*_*tim 7

我什么时候应该在C++中使用引用?

当你需要处理像对象本身这样的变量时(大多数情况下你不明确需要指针而不想取得对象的所有权).

我想知道在可能的规则下如何以及何时应用使用引用.

尽可能,除非您需要:

  • 处理地址(记录地址,诊断或编写自定义内存分配等)
  • 获取参数的所有权(按值传递)
  • 尊重需要指针的接口(C互操作性代码和遗留代码).

Bjarne Stroustrup在他的书中指出他引入了对该语言的引用,因为需要在不制作对象副本的情况下调用运算符(这意味着"通过指针")并且他需要尊重类似于按值调用的语法(这意味着"不是通过指针")(因此参考文献诞生了).

简而言之,您应该尽可能少地使用指针:

  • 如果值是可选的("可以为null"),则在它周围使用std :: optional,而不是指针
  • 如果您需要获取值的所有权,请按值接收参数(而不是指针)
  • 如果您需要在不修改值的情况下读取值,请接收参数 const &
  • :如果你需要动态分配或返回新/动态分配的对象,通过一个传输值std::shared_ptr,std::unique_ptr,your_raii_pointer_class_here不(生)的指针-
  • 如果你需要一个指针传递给C代码,你还是应该使用std :: xxx_ptr类,并使用得到的指针.get()用于获取原始指针.

我想到的一件事是每当我打算将元素放入STL容器时使用指针(或者我可以摆脱它吗?)

您可以使用Boost指针容器库.