返回& const或* const? (C ++)

时间:2010-12-25 22:59:52

标签: c++ const

我有自己的班级“SomeObject”,里面有几个成员。

现在,我有另一个类“WorkingClass”将此对象作为私有成员。

我的问题是:我想为“SomeObject”创建一个Getter,但我不希望任何人修改它。

哪种方式更好,1还是2?

class WorkingClass
{
private:
    SomeObject sObj;

public:
    //... 1)
    const SomeObject &const GetSomeObject()
    {
        return mousePosition;
    }

    //... 2)
    const SomeObject *const GetSomeObject()
    {
        return &mouseMovement;
    }
}

我知道你总是可以抛弃const,但是,我只是想让我的代码干净并且安全无瑕

编辑:

然后我还有一个问题。当我有一个智能指针成员并在课堂上大量使用它,然后突然想要有人访问读取一些值,但没有更多,这是一个很好的解决方案还是再次冗长?

class X
{
private:
    boost::shared_ptr<SomeObject> sob

public:
    const const & GetSomeObject()
    {
        return *sob.get();
    }
}

如何返回“const boost :: shared_ptr&lt; ...&gt; GetX()”?它可能不是真正的必要,但仍然没有用,因为在这种情况下编译器会禁止GetX()。reset(..),并且没有const boost :: ...声明这将是允许的无用操作。或者我错了?

2 个答案:

答案 0 :(得分:7)

两者都不好:

  • const SomeObject &const格式不正确。您无法限定参考资格。 (当然,您可以限定指示类型。)

  • const SomeObject *const不必要地冗长。函数调用表达式o.GetSomeObject()是一个rvalue表达式,只有类型类型的rvalues可以是const限定的。你也可以说const SomeObject*。 (const SomeObject *const实际上可能导致模板实例化问题,但这种问题很少见。)

至于您是选择通过指针还是通过引用返回,这取决于您使用返回值的方式。两者都可以在不同的情况下有意义。无论如何,你想要返回一个const对象的引用或指针,而不是const引用或const指针:

const SomeObject& GetSomeObject() { ... }
const SomeObject* GetSomeObject() { ... }

通常,最好返回参考。

答案 1 :(得分:5)

撰写& constpointless。参考文献总是不变的。在那里省略const关键字。

如果要返回常量非null 对象,则使用引用会更好。如果要返回对象或空指针,请改用指针。

另见When should I use references, and when should I use pointers?

  

尽可能使用引用,并在必要时使用指针。

     

每当您不需要“重新安装”时,引用通常优先于指针。这通常意味着引用在类的公共接口中最有用。引用通常出现在对象的外观上,而内部则出现指针。

     

上面的例外是函数的参数或返回值需要“sentinel”引用 - 一个不引用对象的引用。这通常最好通过返回/获取指针,并给出NULL指针这一特殊意义(引用应始终别名对象,而不是取消引用的NULL指针)。

相关问题