c++ - 函数中的智能指针

标签 c++ std smart-pointers

这是严格意义上的理论问题。 当项目基于智能指针时,几乎所有类都使用它们来包装它们的指针成员,将普通指针传递给成员/非成员函数是否是一种不好的做法? 我的意思是,拥有像这样的成员函数是否正确:

void Function(SomeClass* pSomeClass);

或者它应该永远是:

void Function(std::shared_ptr<SomeClass> pSomeClass);

我还想知道传递 const 引用是否有任何重要的后果(标准 const 特性除外):

void Function(const std::shared_ptr<SomeClass>& pSomeClass)

当类使用 std::unique_ptr 来保护其成员时,例如,在类私有(private)成员函数中使用指向其成员的指针,情况会怎样?是不是也要包起来还是应该认为是设计错误?

最佳答案

如果函数只需要指向的对象并且它必须始终是有效对象,而不是 null,则通过引用传递对象(const 或 non-const,取决于通常的规则) .

如果函数只需要指向的对象,或者可选的 null,则通过原始指针(根据通常的规则,指向 const 或非常量)。

如果函数需要共享所指向对象的所有权,则按值传递 shared_ptr

如果函数需要修改对象的shared_ptr句柄(例如reset),通过非-传递shared_ptr常量引用

如果函数需要访问shared_ptr句柄上的信息(如use_count),但不应该修改shared_ptr,传递shared_ptr by const reference.

关于c++ - 函数中的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34329099/

相关文章:

c++ - 如何使用条件表达式返回对象指针?

c++ - 是否有必要释放 shared_ptr?

c++ - 可变类的文件包含问题

c++ - 为什么不复制一个由单个 shared_ptr 组成的类

c++ - QThread 奇怪的行为

C++ 如何创建一个动态 vector 数组?

c++ - std::set<VALUE, std::owner_less<VALUE>> 的目的是什么?

c++ - OPENCV waitKey() 方法返回类型

c++ - 为什么在新的 IDE 中必须使用命名空间标准,而用 Turbo C++/Borland C++ 编写的程序不需要命名空间标准?

c++ - 在将 unique_ptr 移动到同一对象的基类构造后,使用指向对象的原始指针初始化字段