将某些东西声明为const可以帮助编译器检测出错误用法,const

编译器强制实施bitwise constness,但是你code的时候应该使用“概念上的常量性”

当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。

0)迭代器类似T*指针,声明迭代器为const就像声明指针为const一样。(即声明一个T* const指针)

如果你希望迭代器所指的不能被改动,需要的是const_iterator

vector<int>::iterator iter = vec.begin();//iter作用像T* const

*iter  = 10;//没问题,改变iter所指物

iter++;//错误,iter是const

vector<int>::const_iterator cIter = vec.begin();//作用像const T*

*cIter  = 10;//错误 *cIter是const

iter++;//OK

返回值为const 防止(a*b)=c;这样的暴行

1)const成员函数之所以重要,因为a)知道哪个函数可以改动对象内容;b)使得“操作const对象”成为可能。

两个成员函数如果只是常量性(constness)不同,可以被重载。

#include <iostream>
#include <string.h>
using namespace std;

class TextBlock
{
private:
    char text[256];
    
public:
    TextBlock(char *input)
    {
        strcpy(text,input);
    
    }
    //!!!REMEMBER IT!!!!
    //operator[] for const object
    const char& operator[](std::size_t position) const
    {
        cout << "now in the const member\n";
        return text[position];
    }
    //operator[] for non-const object
    char& operator[](std::size_t position)
    {
        cout << "now in the non-const member\n";
        return text[position];
    }            
};

int main()
{
    TextBlock tb("hello");
    cout << tb[0] <<'\n';
    const TextBlock ctb("world");
    cout << ctb[0] <<'\n';
    
    return 0;
}

now in the non-const member
h
now in the const member
w

2)在const和non-const成员函数中避免重复

class TextBlock

{

public:

  const char& operator[](size_t position) const

  {  //bounds checking,log access data,verify data integrity...

    return text[position];

  }

  char& operator[](size_t position)//现在只调用const op[]

  {

    return const_cast<char&>(//将op[]返回值的const转除

      static_cast<const TextBlock&>(*this)[position]);//为*this加上const调用const op[]

      

  }//代码写的真巧妙,我这辈子估计都写不出这么巧妙的代码了。。。。

  

};

[EffectiveC++]item3:尽可能使用const的更多相关文章

  1. Effective C++ 之 Item 3:尽可能使用 const

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...

  2. [EffectiveC++]item03:尽可能使用const 并且转载一篇关于const函数的博客

    速度 #include <iostream> using namespace std; class TextBlock { private: string text; public: Te ...

  3. C++ const用法 尽可能使用const [转载]

    C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...

  4. 尽可能使用 const

    前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. ...

  5. C++ const用法 尽可能使用const

    C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...

  6. 【转】C++ const用法 尽可能使用const

    http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...

  7. 第二篇:尽可能使用 const

    前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. ...

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

    如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...

  9. 【03】尽可能使用const

    1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中 ...

随机推荐

  1. mysql修改root密码和对连接授权

    mysql修改root密码 首先 mysql -uroot -p 进入mysql界面后执行 set password for root@localhost = password('111111');  ...

  2. 决策树遇到sklearn.exceptions.NotFittedError: XXX instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.的解决方案

    1.异常信息: C:\Python36\python36.exe "E:/python_project/ImoocDataAnalysisMiningModeling/第6章 挖掘建模/6- ...

  3. git 切换 远程仓库

    $ git remote rm origin $ git remote add origin '仓库地址.git' $ git branch --set-upstream-to=origin/mast ...

  4. pygame(一)

    昨天,是有在树莓派上面操作pygame的,但是树莓派又上不了网了,很奇怪,我的306wifi显示的是树莓派连接成功,但是就是无法用网络,所以就下载不了图片,坐等HDMI线吧. 现在,看小甲鱼的视频已经 ...

  5. SQL Server中的小技巧(重复、替换、截取、去空格、去小数点后的位数)

    PS:随笔写的在SQL Server中要用到的 (重复.替换.截取.去空格.去小数点后的位数) /*---------------------------重复--------------------- ...

  6. [javaSE] 进制转换(二进制十进制十六进制八进制)

    十进制转二进制,除2运算 十进制6转二进制是 110  (注意从右往左写,使用算式从下往上写) 二进制转十进制,乘2过程 二进制110转十进制  0*2的0次方+1*2的1次方+1*2的2次方=6 对 ...

  7. 基于Spark GraphX计算二度关系

    关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友 ...

  8. layui使用 ——父,子页面传值

    页面传值是非常常用的,layui自带弹窗功能,但是内置使用的是location.href 暂时没找到方法条件请求头,所以在后台需要放开拦截器, layer.open({ type : 2, title ...

  9. 撩课-Java每天5道面试题第25天

    156.mvc:view-controller有什么作用? 当我们发送一个请求时,如果没有找到对应的mapping 则会对配置文件当中匹配mvc:view-controller 注意点:使用时要添加后 ...

  10. linux的环境变量与文件查找

    1. 环境变量 1.1 变量 shell 中的变量有不同类型,可参与运算,有作用域限定 变量的作用域即变量的有效范围(比如一个函数中.一个源文件中或者全局范围),在该范围内只能有一个同名变量.一旦离开 ...