非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,首先需要将*this强转成non-const: static_cast(this),这样直接去掉this对象的const属性具有不安全性。
    • non-const调用const版本时,const版本保证了数据的const属性,而const版本调用non-const版本时,non-const版本可能会改变对象的成员值。

备注:

  • 将一个const值转换为非const值 比 将一个非const值转换为const的值 更安全, 因为将一个非const的值转换为const的时候非const的值可能发生变化。而const转成非const,const保证了变量的常量性。

你可能感兴趣的:(#,1.1,c++)