在C++类中重新声明一个函数

5
class arbit
    {
        int var;
        public:

        int method1();
        int method1() const;

    };

为什么在这里声明同一个函数两次,g++没有发出警告?
2个回答

15
因为一个是const的,另一个不是。它们是带有不同签名的不同重载函数。其中一个会被调用,取决于你所调用的对象是否为const。
例如:
arbit x;
x.method1(); // calls the non-const version
arbit const &y = x;
y.method1(); // calls the const version
如果一个方法不会修改对象的(可见)状态,那么你应该将它声明为const。这样可以分发const arbit对象,并确保其他人不会意外地修改它们。
例如,你可以使函数setValueconst(因为它修改了对象),但getValue应该是const的。所以在一个const对象上,你可以调用getValue但是不能调用setValue
¹有志者事竟成,使用const_cast即可实现。但请忘记我曾经告诉过你这个方法。

是的,C++将const视为重载参数。 - Digikata
const上进行重载非常有用。例如,查看std::vector中的operator[] - Fred Larson
1
一个const成员函数可以被const和非const对象调用,而非const成员函数只能被非const对象调用。现在我如何从一个非常量对象x中调用method1函数的const版本。是使用const_cast来为我执行所需的操作吗? - Amit
@Amit:在实际生活中,这两个重载通常执行完全相同的操作。没有必要自己选择调用哪一个。这些重载只是为了正确传播const(如果您有一个const向量,则operator[]会给您不可修改的引用,否则它会给您可以修改的引用,您可以对该引用进行任何操作)。 - UncleBens
感谢大家的意见。 - Amit
1
@Amit 像 @Uncle 所说的那样,如果一个函数有 const 和非 const 两个版本,它们最好做相同的逻辑操作,否则你会遇到很多麻烦。但是如果你真的想要 const 版本,你需要通过 arbit x; static_cast<const arbit&>(x).method1(); 将对象变为 const。 - GManNickG

3

您还可以使用volatile修饰符和两者的组合进行重载:const volatile

#include <iostream>
using namespace std;

class foo {
public:
    void bar()                { cout << "bar()" << endl; }
    void bar() const          { cout << "bar() const" << endl; }
    void bar() volatile       { cout << "bar() volatile" << endl; }
    void bar() const volatile { cout << "bar() const volatile" << endl; }
};

int main() {
    foo f;
    f.bar();

    foo const f_const;
    f_const.bar();

    foo volatile f_volatile;
    f_volatile.bar();

    foo const volatile f_const_volatile;
    f_const_volatile.bar();
}

那将输出:
bar()
bar() const
bar() volatile
bar() const volatile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接