GotW #06 Const-Correctness
著者:Herb Sutter
翻译:kingofark
[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删除其备份。译者kingofark对违反上述两条原则的人不负任何责任。特此声明。
Revision 1.0
Guru of the Week 条款06:正确使用const
难度:6 / 10
(总是尽可能的使用const,但也不要用得太过分而造成滥用。哪些地方应该用const,哪些地方不应该用?这里我们列举一些或明显或不明显的例子。)
[问题]
Const是编写“安全”代码的一个强有力的工具,还有利于编译器的优化处理。你应该尽可能的使用它……但是,“尽可能的”到底是什么意思?
请不要评价这个程序的好坏,也不要改变它的结构;这个程序是为了说明本条款的问题而故意精心设计的。你只要在适当的地方对其添加或者删除“const”(包括各种变体和相关的关键字)就可以了。(附加题:哪些地方的const用法造成了程序有无法预料的结果或者无法编译通过的错误?)
class Polygon {
public:
Polygon() : area_(-1) {}
void AddPoint( const Point pt ) {
InvalidateArea();
points_.push_back(pt);
}
Point GetPoint( const int i ) {
return points_[i];
}
int GetNumPoints() {
return points_.size();
}
double GetArea() {
if( area_ < 0 ) // 如果还没有被计算和保存,
CalcArea(); // 那么现在就开始。
return area_;
}
private:
void InvalidateArea() { area_ = -1; }
void CalcArea() {
area_ = 0;
vector<Point>::iterator i;
for( i = points_.begin(); i != points_.end(); ++i )
area_ += /* some work */;
}
vector<Point> points_;
double area_;
};
Polygon operator+( Polygon& lhs, Polygon& rhs ) {
Polygon ret = lhs;
int last = rhs.GetNumPoints();
for( int i = 0; i < last; ++i ) // 连接
ret.AddPoint( rhs.GetPoint(i) );
return ret;
}
void f( const Po