const 成员函数

<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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值