将某些东西声明为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. 图像RGB2YUV与YUV2RGB格式互转介绍

    1 YUV格式与RGB格式说明 由于不同国家的电视信号系统支持的图像格式不同,有YUV格式成像,也有RGB格式成像,因此为了保证兼容性,需要进行RGB与YUV格式的互转. 另外YUV格式具有亮度信息和 ...

  2. jqGrid资源

    在比较多个Grid后决定以后还是用jqGrid,并且是free-jqgrid分支版,  jqgrid优点很多: 加载大量数据时效率很好, 支持排序, 支持过滤, 支持resize, 支持分页, 支持e ...

  3. <python数据挖掘入门与实战>代码

    从百度搜索,净是csdn下载的,现在csdn下载弄的很恶心,垄断并且只想赚钱了,不想使用, 去github上找到了. https://github.com/PacktPublishing/Learni ...

  4. [转]OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(上)

    本文转自:http://www.cnblogs.com/qianmarv/p/4671394.html 1 扫盲 什么是SAP Fiori? 了解SAP UI5必须要从SAP Fiori开始,两者概念 ...

  5. C# 核心语法-反射(反射类型、方法、构造函数、属性,实现可配置可扩展,完成数据库访问类反射封装)

    反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使 ...

  6. jquery里正则的使用方法及常用的正则验证

    本文是一篇关于jquery使用正则来验证输入,及一些常用验证规则的基础文章,适合新手. 假设我们的网页里有这样的一个表单: <input id="aijquery" type ...

  7. c# 删除文件,清理删除文件

    c# 删除程序占用的文件,清理删除文件,彻底删除文件,解除文件占用 文件打开时,以共享读写模式打开 FileStream inputStream = new FileStream(name, File ...

  8. nginx配置样例

    简单的nginx配置如下,包含了静态文件配置.websocket.socket.io的配置: user nobody; worker_processes 3; #master_process off; ...

  9. SSM maven框架下载简易版

    1.前台一个a标签,写个地址就行了 例如 <a href="${pageContext.request.contextPath}/fileDownLoad">前去下载& ...

  10. 51NOD1965:奇怪的式子

    传送门 拆开变成 \[\prod_{i=1}^{n}\sigma_0(i)^{\mu(i)}\prod_{i=1}^{n}\sigma_0(i)^{i}\] 考虑 \(\prod_{i=1}^{n}\ ...