Effective C++ Item03 Note

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

//T const*和const T*是同样的
//const出现在*号左边,表示所指物是常量,出现在*号右边,表示指针是常量
class Widget{
private:
	int size;
public:
	int getSize() const{
		return size;
	}
};
//f1与f2接受的参数写法不同,但是都是相同的
void f1(const Widget* pw){
	cout << pw->getSize() << endl;
}
void f2(Widget const* pw){
	cout << pw->getSize() << endl;
}

//令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。
class Rational{
private:
	int var;
public:
	Rational(int var){
		this->var = var;
	}
	int getVar() const{
		return this->var;
	}
	const Rational operator* (const Rational& hs);
};
const Rational Rational::operator*(const Rational& hs){
	return const Rational(this->var*hs.getVar());
}

//两个成员函数如果只是常量性不同,可以被重载
//解决const版本和非const版本的operator[]函数的代码重复问题可以使非const版本的函数调用const版本的函数
class TextBlock{
private:
	string text;
public:
	TextBlock(string text){
		this->text = text;
	}
	const char& operator[](std::size_t position)const{
		return text[position];
	}
	//调用const版本的operator[]函数,避免代码重复问题
	char& operator[](std::size_t position){
		//return text[position];
		return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
	}
};

//logical constness
class CTextBlock{
private:
	//string text;
	char* pText;
	mutable std::size_t textLength;
	mutable bool lengthIsValid;
public:
	CTextBlock(char* pText){
		strcpy(this->pText, pText);
		lengthIsValid = false;
	}
	char& operator[](std::size_t position)const{
		return pText[position];
	}
	//将textLength和lengthIsValid声明为mutable从而可以在const函数内部修改它们的值
	std::size_t length()const{
		if (!lengthIsValid){
			textLength = strlen(pText);
			lengthIsValid = true;
		}
		return textLength;
	}
};

int main(){
	//STL迭代器的const用法
	std::vector<int> vec;
	vec.push_back(5);
	//声明迭代器为const就像声明一个T* const指针
	const std::vector<int>::iterator iter = vec.begin();
	*iter = 10;
	//++iter;//错误
	//如果希望STL模拟一个const T*指针,你需要的是const_iterator
	std::vector<int>::const_iterator cIter = vec.begin();
	//*cIter=10;//错误
	++cIter;

	Rational a(1), b(2), c(3);
	//if(a*b=c){}//错误,避免了因打字错误而造成的错误赋值

	//const成员函数
	TextBlock tb("hello");
	cout << tb[0] << endl;
	const TextBlock ctb("World");
	cout << ctb[0] << endl;

	//bitwise constness
	const CTextBlock ctb1("hello");
	ctb1[0] = 'J';//函数声明为const,但还是让客户改变了类的成员变量

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值