<pre name="code" class="cpp"><pre name="code" class="plain">成员函数重载必须满足以下三个条件之一:
1.参数类型不同
2.参数个数不同
3.常量性不同
第三个重要的C++特性往往被忽视。
const 成员函数有两个目的:
1.使 class 接口比较容易理解。因为只有 non-const 成员函数 才可以修改 对象内容, const 成员函数不可以直接修改对象内容。
2. const 对象只可 调用 const 成员函数,non-const 对象可以隐式转换到 const 对象,因此 const 成员函数 和non-const 成员函数都可调用。
下面用代码说明:
</pre><pre name="code" class="cpp">#ifndef TESTCONST_H_
#define TESTCONST_H_
#include <iostream>
class TextBlock
{
public:
TextBlock(std::string text):_text(text)
{
std::cout<<"Constructor Called"<<std::endl;
}
TextBlock( std::string &text):_text (text)
{
std::cout<<"Copy Constructor Called"<<std::endl;
}
const char& operator[] (std:: size_t position)const
{
std::cout<<"const char& operator[] (std:: size_t position)const"<<std::endl;
return _text[position];
}
char& operator[](std::size_t position)
{
std::cout<<"char& operator[](std::size_t position)"<<std::endl;
return _text[position];
}
private:
std::string _text;
};
#endif
#include "TestConst.h"
void Print(const TextBlock& ctb,std::size_t position)
{
std::cout<<ctb[position]<<std::endl;
}
int main()
{
TextBlock tb("Hello");<span style="white-space:pre"> </span>//non-const 对象
std::cout<<tb[0]<<std::endl; //调用 TextBlock operator[](std::size_t position);
tb[0] = 'h';<span style="white-space:pre"> </span>/*修改对象,如果non-const 成员返回值前面 加上 const 修饰 ,则编译错误,const 返回值不可修改*/
<span style="white-space:pre"> </span>
Print(tb, 0);
const TextBlock ctb("World");<span style="white-space:pre"> </span>//const 对象
std::cout <<ctb[0]<<std::endl;<span style="white-space:pre"> </span>//注释const成员函数,则编译错误,const 对象 不可以调用 non-const 成员函数
//ctb[0] = 'w'; //错误<span style="white-space:pre"> </span>//修改
return 0;
}
</pre><pre name="code" class="cpp"><img src="https://img-blog.csdn.net/20140731212901000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5vY2VudERldmls/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
注释掉 const 成员函数后 只有 tb[0] = 'h';编译错误,注释该语句后程序正常运行。
注释后正常运行,我猜测是 non-const 对象 可以隐式转换为 const 对象,注意自身const 类型并没有改变。
注释前编译错误上面已经说明,此时调用的是 const 成员函数,刚巧这个const成员函数返回值也是const,所以不可修改。
参考文献:Effective C++ 条款3:尽可能使用const