gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:34 26 4
gpt4 key购买 nike

我已经使用 C++ 编程一段时间了,我开始怀疑规则尽可能使用引用是否应该适用于任何地方。

不同于this related SO post我对另一种事物感兴趣。

根据我的经验,引用/指针的混合会弄乱你的代码:

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

一种选择是将 & 替换为 * const,例如将 Foo & 替换为 Foo * const

void some_func_by_ref(const std::vector<Foo * const> * const); // BAD: verbose!

这样至少遍历消失了。而我重写函数头已经消失了,因为所有参数都将是指针......以使用 const 而不是指针算法(主要是 &*).

我想知道您如何何时应用尽可能使用引用规则。

考虑:

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

    • 避免应用 *Foo* 转换为 Foo&,反之亦然
    • 避免在 * const 中过度使用 const

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

我不认为这是 C++03 特有的东西,但 C++11 解决方案如果可以向后移植到 C++03 就很好(即:NRVO 而不是移动语义)。

最佳答案

When should I use references in C++?

当您需要像对待对象本身一样对待变量时(大多数情况下您并不明确需要指针并且不想取得对象的所有权)。

I would like to know how and when you apply use references whenever possible rule.

只要有可能,除非您需要:

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

Bjarne Stroustrup 在他的书中指出,他引入了对该语言的引用,因为需要在不复制对象的情况下调用运算符(这意味着“通过指针”),并且他需要遵守类似于按值调用的语法(这意味着“不是通过指针”)(因此引用诞生了)。

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

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

one thing I figured is to use pointers whenever I intend to ever put the element into an STL container (or can I get rid of this?)

您可以使用 Boost Pointer Container library .

关于c++ - 什么时候应该在 C++ 中使用引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com