【问题标题】:returning &const or *const? (c++)返回 &const 或 *const? (c++)
【发布时间】:2010-12-25 22:59:51
【问题描述】:

我有自己的类“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<...> GetX()" 怎么样?它可能不是真的必要,但仍然不是无用的,因为在这种情况下编译器会禁止 GetX().reset(..) ,并且如果没有 const boost::... 声明,这个无用的操作将被允许。还是我错了?

【问题讨论】:

  • 好吧,因为 someobject 是一个相当大的类。我只是想把它传回去,让其他人可以访问一些值
  • 按值返回对象通常是安全的,因为每个现代编译器都实现了 RVO 和 NRVO。担心这是过早的优化。 :)

标签: c++ constants


【解决方案1】:

两者都不好:

  • const SomeObject &amp;const 格式错误。您不能对引用进行 const 限定。 (当然,您可以限定引用类型。)

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

至于选择指针返回还是引用返回,就看你是怎么使用返回值了。两者都可以在不同的情况下有意义。无论如何,您都希望返回指向 const 对象的引用或指针,而不是 const 引用或 const 指针:

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

通常,最好返回一个引用。

【讨论】:

  • @cppanda:如果您不需要指针,请使用引用。很少需要指针。
  • 每个引用都是常量引用。所以const SomeObject &amp;constconst SomeObject &amp; 相同。 IMO 最好通过引用返回。
  • 那么我还有一个问题。当我有一个智能指针成员并在课堂上大量使用它,然后突然希望有人有权读取一些值但仅此而已,这会是一个好的解决方案还是会再次冗长? X 类 { 私有:boost::shared_ptr 啜公共: const const & GetSomeObject() { return *sob.get(); } }
【解决方案2】:

&amp; constpointless。引用总是不变的。省略 const 关键字。

如果您想返回一个常量 non-null 对象,使用引用会更好。如果要返回对象或空指针,请改用指针。

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

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

当您不需要“重新定位”时,通常首选引用而不是指针。这通常意味着引用在类的公共接口中最有用。引用通常出现在对象的皮肤上,而指针则出现在内部。

上述情况的例外是函数的参数或返回值需要一个“哨兵”引用——一个不引用对象的引用。这通常最好通过返回/获取一个指针,并赋予 NULL 指针特殊的意义(引用应始终为对象别名,而不是取消引用的 NULL 指针)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    相关资源
    最近更新 更多