调用 shared_ptr 对象方法
Calling shared_ptr object method
这似乎是一个非常愚蠢的问题,所以请耐心等待。我在我的程序中使用智能指针代替原始指针。建议我不要使用原始指针或尽可能混合使用两者。我也明白这一点。我也知道只有在必要时才应该使用指针。
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();
我觉得选项一更正确,因为选项二使用原始指针。但是在这里使用原始指针可能不会受到伤害,因为我没有分配或取消分配。
我经常对这两个选项感到困惑。哪个更好?他们只是一样吗?谢谢
之间没有功能差异
//Option I
v=foo->getvalue();
和
//Option II
v=foo.get()->getvalue();
但是选项 II 需要输入更多内容,为什么?
两种构造在这种情况下的作用完全相同。
这与智能指针和原始指针没有任何关系。原始指针的问题纯粹是原始 owning 指针。原始非拥有指针没有错。
原始指针不是敌人。没有它们的一种形式,我们就无法用 C++ 编写任何有用的程序。问题是 拥有 原始指针。它们没有与其类型相关联的明确所有权语义,因此程序员需要完成手动管理生命周期的艰巨任务。如果需要,不要害怕将原始指针作为句柄传递。
这将我们带到下一点。您演示的两种方法都依赖于原始指针。重载的 operator->
必须 return 一个原始指针(最终),以便我们在对象上应用成员访问。本质上,第一个版本相当于
v = foo.operator->() -> getvalue();
它的操作与第二种形式完全相同,只是在上面加了句法糖。
您应该更喜欢第一种形式,因为它更短且更易读。但它并没有避免原始指针,这是不可能避免的。
这两个选项在汇编代码中可能会得到相同的结果。第一个选项 foo->getvalue()
是首选选项,因为这提供了更好的可读性。
这似乎是一个非常愚蠢的问题,所以请耐心等待。我在我的程序中使用智能指针代替原始指针。建议我不要使用原始指针或尽可能混合使用两者。我也明白这一点。我也知道只有在必要时才应该使用指针。
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();
我觉得选项一更正确,因为选项二使用原始指针。但是在这里使用原始指针可能不会受到伤害,因为我没有分配或取消分配。
我经常对这两个选项感到困惑。哪个更好?他们只是一样吗?谢谢
//Option I
v=foo->getvalue();
和
//Option II
v=foo.get()->getvalue();
但是选项 II 需要输入更多内容,为什么?
两种构造在这种情况下的作用完全相同。
这与智能指针和原始指针没有任何关系。原始指针的问题纯粹是原始 owning 指针。原始非拥有指针没有错。
原始指针不是敌人。没有它们的一种形式,我们就无法用 C++ 编写任何有用的程序。问题是 拥有 原始指针。它们没有与其类型相关联的明确所有权语义,因此程序员需要完成手动管理生命周期的艰巨任务。如果需要,不要害怕将原始指针作为句柄传递。
这将我们带到下一点。您演示的两种方法都依赖于原始指针。重载的 operator->
必须 return 一个原始指针(最终),以便我们在对象上应用成员访问。本质上,第一个版本相当于
v = foo.operator->() -> getvalue();
它的操作与第二种形式完全相同,只是在上面加了句法糖。
您应该更喜欢第一种形式,因为它更短且更易读。但它并没有避免原始指针,这是不可能避免的。
这两个选项在汇编代码中可能会得到相同的结果。第一个选项 foo->getvalue()
是首选选项,因为这提供了更好的可读性。