这似乎是一个很愚蠢的问题,请耐心等待。我在程序中使用智能指针代替原始指针。建议不要使用原始指针或将两者尽可能地混合。我也知道我也知道,仅在必要时才使用指针。
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使用原始指针。但是在这里使用原始指针可能不会造成伤害,因为我没有分配或取消分配。
通常,我对这两个选项感到困惑。哪个更好?他们是一样的吗?谢谢。
之间有[[no功能差异
//Option I
v=foo->getvalue();
和
//Option II v=foo.get()->getvalue();
但是选项II的类型更多,为什么?在这种情况下,两种构造都完全相同。
owning原始指针。它们没有与它们的类型相关联的明确的所有权语义,因此程序员需要手工完成管理生命周期的艰巨任务。如果需要,不要担心传递原始指针作为句柄。
这将我们带到下一点。您演示的这两种方法都依赖于原始指针。重载的operator->
必须返回一个原始指针(最终),以使我们在该对象上应用成员访问。本质上,第一个版本等效于
v = foo.operator->() -> getvalue();
它的功能与第二种形式完全相同,只是语法糖放在最前面。您应该选择第一家公司,因为它更短且可读性更好。但这不能避免使用原始指针,这是不可避免的。
foo->getvalue()
是首选选项,因为它提供了更好的可读性。