如果我理解正确,应该将不应修改对象的成员函数声明为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
成员!
答案 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正确性。