将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象相关的知识,希望对你有一定的参考价值。

例:

class Bar;

class Foo
{
public:

    Foo(const Bar& bar) : mBar(&bar) {}

    /* Other methods use mBar. */

private:

    const Bar* mBar;
};

因此,目标是将const指针存储到某个外部对象,而不是存储外部对象内容的副本。

  • 通过const参考:Foo(const Bar& bar) 将对象传递给构造函数的常用习惯用法,许多程序员会认为Foo会存储Bar的副本而不是指针/引用本身。 来电者可以暂时通过。这可以通过删除r值重载Foo(const Bar&&) = delete来防止。然而,这不是万无一失的,因为您仍然可以通过一个带有const引用并返回const引用的函数来偷运临时对象。以Foo afoo(std::min(Bar{}, anotherBar));为例。
  • 通过const指针:Foo(const Bar* bar) 必须检查nullptr,这是一个运行时检查,首选编译时机制。 仍然可以走私临时工:Foo afoo(&std::min(Bar{}, anotherBar));

以上哪个是首选,为什么?或者有没有更好的方法来做到这一点,没有上述问题?

答案

你可以接受一个::std::reference_wrapper<Bar>,它将处理传递rvalue的情况,并提供一个提示你正在复制包装而不是对象。

以上是关于将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象的主要内容,如果未能解决你的问题,请参考以下文章

通过指针或引用将映射传递给函数?

小白学习C++ 教程八在C++指针传递引用和Const关键字

将指针分配给指针(并将指针传递给类)时使用删除的 C++ 混淆

如何使 const 适用于作为共享指针的 C++ 类成员

小白学习C++ 教程八在C++指针传递引用和Const关键字

如何将 const 字符串引用与字符串指针进行比较?