非const版本调用const版本函数,可以减少代码重复

非const版本调用const版本函数,可以减少代码重复

源自effective c++ 条款3 : 尽可能使用const

原始实现:

Class ClassA {
	string text;
public:
	ClassA(string s) : text(s){};
	const char& operator[] (size_t position) const // const版本
	{
		... 做一些额外的事情
		return text[position];
	} 
	char& operator[] (size_t position) // 非const版本
	{
		... 做一些额外的事情
		return text[position];
	}
}

改变后:

Class ClassA {
	string text;
public:
	ClassA(string s) : text(s){};
	const char& operator[] (size_t position) const
	{
		... 做一些额外的事情
		return text[position];
	} 
	char& operator[] (size_t position) // 非const版本通过const版本实现
	{	
		// 首先static_cast将*this对象转型为const对象,然后调用const版本operator[]返回const引用
		// 然后用const_cast去掉返回值的const属性
		return const_cast<char&>(static_cast<const ClassA &>(*this)[position]);
	}
}

反过来:const调用非const来实现(不安全,不推荐)

class ClassA {
	string text;
public:
	ClassA(string s) : text(s){};
	char& operator[] (size_t position)
	{
		//... 做一些额外的事情
	    return text[position];
    }
	const char& operator[] (size_t position) const
	{
		return (const_cast<ClassA &>(*this))[position];
	}
};

  • non-const版本调用const版本来实现,减少了代码的冗余。
  • 为什么不先实现non-const版本,在通过non-const版本实现const版本?
    • non-const调用const版本时,const版本保证了数据的const属性,而const版本调用non-const版本时,non-const版本可能会改变对象的成员值。
    • 如果使用non-const版本实现const,首先需要将*this强转成non-const: static_cast<ClassA &>(this),这样直接去掉this对象的const属性具有不安全性。

备注:

  • 将一个const值转换为非const值 比 将一个非const值转换为const的值 更安全, 因为将一个非const的值转换为const的时候非const的值可能发生变化。而const转成非const,const保证了变量的常量性。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值