我可以使用const成员函数返回* this并使用非常量对象吗?

时间:2015-07-05 12:55:11

标签: c++

如果我理解正确,应该将不应修改对象的成员函数声明为const,以便让用户了解保证。现在,当该成员函数返回对*this的引用时会发生什么?例如:

class C{
public:
    C &f() const {return *this;}
};

C::f()内,this的类型为const C*,因此,以下内容无法编译:

int main() {
    C c; // non-constant object!
    c.f();
    return 0;
}

当然,我们可以提供非C::f()的非常量版本来处理非常量对象:

class C{
public:
    const C &f() const;
    C &f();
};

然而,我不相信这是我们想要的。请注意,非常量版本不会更改对象,但是对用户的这种承诺没有表达出来......我错过了什么?

编辑:为了清楚起见,我只想总结一下这个问题:f()不会修改调用它的对象,因此将其声明为C &f();而不将其设为const成员是误导。另一方面,我确实希望能够在非const对象上调用f()。我该如何解决这种情况?

编辑:它来自评论中发生的所有讨论,该问题是基于对函数成员的const含义的错误理解。我正在为自己带走的正确理解是:

返回非const引用的成员函数旨在允许其用户通过返回的引用更改对象。因此,即使此函数本身不改变对象,也不应该倾向于将其声明为const成员!

1 个答案:

答案 0 :(得分:3)

您的问题是原始功能定义:

C &f() const {return *this;}

这里你返回一个对const对象的非const引用,这将允许更改const对象并且是危险的,因此它是被禁止的。

如果你把它写成

const C &f() const {return *this;}

可以从const和非const对象中调用,并且总是返回一个const引用。

  

当然,我们可以提供一个非常量版本的C :: f()来处理非常量对象。但是,我不相信这就是我们想要的。

可能这正是你想要的。它是在非const对象上调用时返回非const引用的唯一方法,并且在const对象上调用它时保持const正确性。