#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,但还是让客户改变了类的成员变量
}
Effective C++ Item03 Note
最新推荐文章于 2014-12-10 16:03:26 发布