class arbit
{
int var;
public:
int method1();
int method1() const;
};
为什么g ++在这里两次声明相同的函数时不会发出警告?
答案 0 :(得分: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
个对象,并确定有人不会意外地修改它们。
例如,您可以创建一个函数setValue
非 - const
(因为它会修改对象),但getValue
将是const
。因此,在const
对象上,您可以拨打getValue
但不能setValue
。
¹当有遗嘱时,有一种方式,它被称为const_cast
。但忘记我曾经告诉过你。
答案 1 :(得分: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