调用shared_ptr对象方法

问题描述 投票:0回答:3

这似乎是一个很愚蠢的问题,请耐心等待。我在程序中使用智能指针代替原始指针。建议不要使用原始指针或将两者尽可能地混合。我也知道我也知道,仅在必要时才使用指针。

class Foo{
  private: int val;
  public: 
    Foo(int v) :val(v){}
    int getvalue() const { return val; }
};

std::shared_ptr<Foo> foo = std::make_shared(Foo(10));

int v;

//Option I
v=foo->getvalue();

//Option II
v=foo.get()->getvalue();

我认为选项I更正确,因为选项II使用原始指针。但是在这里使用原始指针可能不会造成伤害,因为我没有分配或取消分配。

通常,我对这两个选项感到困惑。哪个更好?他们是一样的吗?谢谢。

c++ smart-pointers
3个回答
0
投票

之间有[[no功能差异

//Option I v=foo->getvalue();

//Option II v=foo.get()->getvalue();

但是选项II的类型更多,为什么?

在这种情况下,两种构造都完全相同。


0
投票
原始指针不是敌人。没有一种有用的程序,我们就无法用C ++编写任何有用的程序。问题是

owning原始指针。它们没有与它们的类型相关联的明确的所有权语义,因此程序员需要手工完成管理生命周期的艰巨任务。如果需要,不要担心传递原始指针作为句柄。

这将我们带到下一点。您演示的这两种方法都依赖于原始指针。重载的operator->

必须返回一个原始指针(最终),以使我们在该对象上应用成员访问。本质上,第一个版本等效于

v = foo.operator->() -> getvalue();
它的功能与第二种形式完全相同,只是语法糖放在最前面。

您应该选择第一家公司,因为它更短且可读性更好。但这不能避免使用原始指针,这是不可避免的。


0
投票
两个选项都可能在汇编代码中得到相同的结果。第一个选项foo->getvalue()是首选选项,因为它提供了更好的可读性。
© www.soinside.com 2019 - 2024. All rights reserved.