我有自己的班级“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 :: ...声明这将是允许的无用操作。或者我错了?
答案 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)
撰写& const
是pointless。参考文献总是不变的。在那里省略const关键字。
如果要返回常量非null 对象,则使用引用会更好。如果要返回对象或空指针,请改用指针。
另见When should I use references, and when should I use pointers?
尽可能使用引用,并在必要时使用指针。
每当您不需要“重新安装”时,引用通常优先于指针。这通常意味着引用在类的公共接口中最有用。引用通常出现在对象的外观上,而内部则出现指针。
上面的例外是函数的参数或返回值需要“sentinel”引用 - 一个不引用对象的引用。这通常最好通过返回/获取指针,并给出NULL指针这一特殊意义(引用应始终别名对象,而不是取消引用的NULL指针)。