条款3:尽可能的使用const

const成员函数的一般好处有:

  • 它使得class接口比较容易理解。
  • 它使得操纵const对象成为可能。

使用的过程中应该在const与non const成员函数之间避免代码重复:

class TextBlock
{
     public:
     ...
     const char & operator[](std::size_t position)const
     {
          ...          //边界检查
          ...          //日志数据访问
          ...          //校验数据完整性
          return text[position];
     }
     char & operator[](std::size_t position)
     {
          ...          //边界检查
          ...          //日志数据访问
          ...          //校验数据完整性
          return text[position];
     }
     private:
     std::string text;
}

这样做可以但是会导致你代码较为臃肿,做了很多的重复性的工作,事实上可以使用const——cast以及static_cast来实现如下的工作

这个就叫做所谓的常量性的转除,用一个operator[]去掉用另外一个operator[]

一般来说,用non-const来调用其const兄弟一般是一种安全的做法:

const char & operator[](std::size_t position)const
{
          ...          //边界检查
          ...          //日志数据访问
          ...          //校验数据完整性
          return text[position];
 }

char &operator[]{std:size_t position}
{
     return const_cast<char&>
     (
          static_cast<const TextBlocks&>(*this)
          [position]
     );
}

  上面这一段可以做一些解释,第二个non-const语句块我们打算让non-const operator调用他的const兄弟,但是non-const操作符的后面如果只是单纯的调用operator[]那么会
  导致iwuxian递归的调用自己,所以应该加上static_cast来将*this先进行转型。所以这里总共是有两次的转型。第一次是将*this从Textblocks转型到const Textblocks,就是为*this
来添加上const,之后再为返回的const operator[]中将const来移除。

  还有一点应该注意的是,绝对不要用const版本来调用non-const版本。

时间: 2024-10-11 17:48:36

条款3:尽可能的使用const的相关文章

Effective C++ 条款3 尽可能用const

1. const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.用const修饰指针,如果const出现在*之前,表明指针不能更改所指向的对象的内容,如果const出现在*之后,表明指针只能指向同一块内存.另外int const*p和const int*p含义相同.如果对象成员有普通指针,那么构造该类的一个const对象时,const修饰使得该指针只能指向同一块内存,但指针指向的内容可以改变. 2. 将某些东西声明为const可以帮助编译器侦测出错误用法. 3. 编译器强制实

条款21: 尽可能使用const

对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const: char *p = "hello"; // 非const指针, // 非const数据 const char *p = "hello"; // 非const指针, // const数据 char * const p = "hello"; // const指针, // 非const数据 const char

Effective C++ 条款三 尽可能使用const

参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以再被修改     const int val = 90;      val = 100;   错误 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改, 则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const

条款32: 尽可能地推迟变量的定义

// 此函数太早定义了变量"encrypted" string encryptPassword(const string& password) { string encrypted;//默认构造函数初始化 if (password.length() < MINIMUM_PASSWORD_LENGTH) { throw logic_error("Password is too short"); } 进行必要的操作,将口令的加密版本 放进encrypted

条款3:尽可能地使用const

如下为const修饰的几种类型: char name[] = "benxintuzi"; char* p1 = name;                // non-const pointer, non-const data const char* p2 = name;         // non-const pointer, const data char* const p3 = name;         // const pointer,      non-const dat

Effective C++ -----条款03:尽可能使用const

如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " hello"; char* p = greeting;  //non-const pointer,non-const data const char* p = greeting;  //non-const pointer,const data  声明p为一个指向常量的greeting的指针,p指向的对象

条款2:尽量以const enum inline 来替换 #define

这里说的意思其实相当于,宁可以用编译器来替换预处理器 因为使用预处理器可能使得被处理过的东西无法进入符号表,例如 #define MAXLEN 16 这里的MAXLEN并没有进入符号表,这样有编译错误出现的时候,提示的都是16而并不是MAXLEN,这样就会带来很多的错误. 对于上面的那个式子,可以尝试的使用用一个常量去替换上面的宏:const int MAXLEN = 16 注意,常量的定义式往往被放在头文件中 应该要注意到的一点:class专属常量,为了将作用域限制在一个class内,应该让他

条款1:尽量用const和inline而不用#define [effective C++ 学习笔记]

这一节主要讲得是,为什么const,inline要比#define好,总结起来如下: 1 如果使用#define,编译器只是会傻乎乎的将define后面的内容替换成定义的变量,拿 const double ASPECT_RATIO = 1.653;举例,如果这样定义后,代码中使用 ASPECT_RATIO 时,在编译代码的时候,会将 ASPECT_RATIO 变量统一替换成1.653这个数字. 看似这样做没什么问题,但是会带来可能的隐患. 隐患一:报错的时候,提示错误的原因会是1.653,这样不

条款02:尽量以const,enum,inline替换#define

1.内置类型用const替换#include 2.字符串类型用const的两种方式 3.数组的大小最好用enum这样给出 4.宏表达式#define CALL_WITHMAX(a,b) f((a)>(b))?(a):(b))可以替换为某个inline函数: 注意: