effective c++ 03_尽可能使用const 学习

来源:互联网 发布:mac不用bootcamp装win7 编辑:程序博客网 时间:2024/06/18 14:38
  1. const可被施加于任何作用域内的对象,函数参数,函数返回值,成员函数本体。
  2. 强调了const修饰指针,可以指出指针自身,指针所指物,或两者都(或都不)是const:
char greeting[] = "Hello";char* p = greeting;    /* non-const pointer, non-const data  两者都不是const */const char* p = greeting; /*non-const pointer, const data 所指物是const */char* const p = greeting; /* const pointer, non-const data 指针自身是const  */const char* const p = greeting; /*const pointer, const data 两者都是const */
  1. 如果用const 修饰STL的迭代器的话,那么迭代器自身就是const的,迭代器所指物可以改变,但是自身就不能迭代了。 所以我个人感觉应该少用或者不用const修饰迭代器。
    STL提供了const_iterator,作用是迭代器所指物不能修改,但是迭代器可以迭代。 应该多使用这个。
std::vector<int> vec;...const std:vector<int>::iterator iter = vec.begin();*iter = 10;    // 没问题,改变iter所指物++iter;         //错误!iter是const,不能迭代了std:vector<int>::const_iterator cIter = vec.begin();*cIter = 10;   // 错误! *cIter是const++cIter;        //没问题,改变cIter.
  1. const修饰成员函数:
    const修饰成员函数的本意是,此函数不会改变class类的成员变量的值。
    这里作者强调了,仅仅常量性(const)不同,可以被重载。 带const的函数,会被const对象调用。不带const的函数,会被普通对象调用。
  2. const修饰函数返回值
    作者强调了可以预防打字错误:
if (a * b = c)... /*喔欧,其实想做一个比较(comparison)动作其实想做: if (a * b == c)如果重载*操作符时,返回值加上了const就可以避免这类错误:*/const Rational opertor* (const Rational & lhs, const Rational& rhs);
  1. 作者强调了当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
class TextBlock {public:...const char& operator[](std::size_t position) const {.........return text[position];}char& operator[](std::size_t position) //现在只调用const op[]{returnconst_cast<char&>(  //将op[]返回值的const转除static_cast<const TextBlock&>(*this)[position] /*为*this加上const, 调用const op[] */);}...};