我可以有一个返回*this并处理非常量对象的const成员函数吗

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

本文关键字:对象 const 成员 函数 常量 非常 返回 有一个 this 处理 我可以      更新时间:2023-10-16

如果我理解正确,应该将不应该修改对象的成员函数声明为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()不会修改调用它的对象,所以在不使其成为const成员的情况下将其声明为C &f();是有误导性的。另一方面,我确实希望能够在非常量对象上调用f()。我该如何解决这种情况?


编辑:从评论中的所有讨论中可以看出,这个问题是基于对功能成员的const含义的错误理解。我正在为自己夺走的正确理解是:

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

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

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

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

如果你把它写成

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

将可从const和非常量对象调用,并且将始终返回const引用。

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

也许这正是你想要的。这是在对非常量对象调用时返回非常量引用并在对常量对象调用时保持常量正确性的唯一方法。