首先一点,二者是可以构成重载的,仅根据返回值的 const/non-const 与否是无法构成重载的;
class A
{
public:
void foo() {}
// 非 const 型成员
};
void foo(const A& a)
{
a.foo();
// 编译器报错
// 对象包含与成员函数不兼容的类型限定符
}
改造为:
class A
{
public:
void foo() { std::cout << "A::foo()" << std::endl;}
void foo() const {std::cout << "A::foo() const" << std::endl; }
// 两者可以构成重载
};
void foo(const A& a)
{ a.foo(); } // 调用的是const型成员函数函数
void foo2(A& a)
{ a.foo(); } // 调用的是 non-const 型成员函数
再看一个更为直观的例子:
class A
{
public:
void foo() const { std::cout << "A::foo() const" << std::endl;}
void foo() { std::cout << "A::foo()" << std::endl;}
void foo2() { std::cout << "A::foo2()" << std::endl; }
};
int main(int, char**)
{
A a;
a.foo();
// 重载时,non-const 的对象自动访问 non-const 的成员方法
a.foo2();
const A aa;
aa.foo();
// aa.foo2(); 会报错
// const 的仅能访问const 的
return 0;
}