const(常)成员函数是一种获取对象状态的成员函数,并且不能改变对象的状态(也就是不能修改对象的成员的值)。声明和定义如下:
class A
{
public:
void func() const;
};
A::void func() const
{
// 常成员函数
}
问题一:如果有两个同名函数,只是其中一个是常成员函数,这样的写法有错吗?
class A
{
public:
void func();
void func() const;
};
编译器并没有报错!
问题二:形参列表应该是一样的,调用的时候,计算机怎么知道是调的哪一个函数?
class A
{
public:
void func() { cout << "func()" << endl; };
void func() const { cout << "func() const" << endl; };
};
int main()
{
A a1;
const A a2;
a1.func();
a2.func();
}
输出:
func()
func() const
说明const对象才能调用const成员函数
!
要弄清这个问题,首先要明白不同的对象是如何共用同一个成员函数的。我们暂且不谈const成员函数,以普通成员函数为例:
int main()
{
A a1;
A a2;
a1.func();
a2.func();
}
当a1和a2分别调用成员函数时,func()是如何辨别这两个对象的呢?
实际上,成员函数有一个隐藏参数——this指针
!也就是说,编译器对成员函数的处理实际上是这样的:
class A
{
public:
void func(A *this);
};
A::void func(A *this)
{
// this指针
}
这样,便能分辨是哪个对象调用了成员函数。我们再回头看这个问题,就很清楚了,实际上编译器处理如下:
class A
{
public:
void func(A *this);
void func(const A *this); // const成员函数
};
很明显,这两个函数互为重载
!重载函数当然同名,而且const对象a2传入的this指针是const指针,才能调用const成员函数。