繁体   English   中英

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

[英]Can I have a const member function that returns *this and works with non-constant objects?

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

您的问题是原始函数定义:

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

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

如果你把它写成

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM