如下为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 data

const char* const p4 = name;  // const pointer,      const data

小技巧:

如果const出现在*号左边,就是non-const pointer, const data;如果出现在*号右边,就是const pointer, non-const data。

const的另外一个用途就是修饰函数:const可以修饰返回值、参数、函数本身。

现在定义一个类TextBlock操作一个字符串的某个字符:

 #include<iostream>

 using namespace std;

 class TextBlock
{
public:
TextBlock(string text)
{
this->text = text;
}
const char& operator[](size_t position) const // 操作常量对象
{
return text[position];
}
char& operator[](size_t position) // 操作非常量对象
{
return text[position];
} private:
string text;
}; int main()
{
TextBlock name("benxintuzi");
cout << name[]; // 调用non-const类型的operator[]
name[] = 'B'; // 正确
const TextBlock cname("tuzi");
cout << cname[]; // 调用const类型的operator[]
cname[0] = 'T'; // 错误 return ;
}

注意:

上边的重载[]操作符返回的是char&,而不是char,否则name[0] = 'B'这样的语句就不能通过编译。究其原因就是如果返回一个内置类型,那么改变其值是不好的,因此C++不会同样这样做,即使有些编译器可以通过,那么最终你改变的也只是一个副本而已,原始的字符并没有改变(因为如果不返回引用,只是返回类型本身的话,C++会调用复制构造函数返回一个副本而已)。

如果我们可以确定成员函数不会改变对象的任何变量,那么我们就可以将函数声明为const,就是:

 #include<iostream>

 using namespace std;

 class TextBlock
{
public:
size_t stat() const; private:
int length;
bool use;
};
size_t TextBlock::stat() const // const函数表示不会改变对象中的所有变量
{
use = true;
17 length = 10;
return length;
} int main()
{
TextBlock tb;
cout << tb.stat() << endl; // assignment of member ‘TextBlock::use’ in read-only object ...
return ;
}

但若是我们想在const函数中改变某个特殊成员变量怎么办呢?利用mutable对变量进行修饰即可:

 class TextBlock
{
public:
size_t stat() const; // const函数表示不会改变对象中的所有变量 private:
mutable int length;
mutable bool use;
};

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

  1. 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define

    条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译--&g ...

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

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

  3. Effective C++_笔记_条款03_尽可能使用const

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法 ...

  4. 《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮

    如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施 ...

  5. 条款03 尽可能使用const

    一.概述 使用const约束对象:可以获得编译器的帮助(指出相关出错的地方) const与成员函数:const重载.转型.避免代码重复 二.细节 1. 为什么有些函数要返回const对象(看上去没必要 ...

  6. 条款3:尽可能的使用const

    const成员函数的一般好处有: 它使得class接口比较容易理解. 它使得操纵const对象成为可能. 使用的过程中应该在const与non const成员函数之间避免代码重复: class Tex ...

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

    参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以 ...

  8. 条款21: 尽可能使用const

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

  9. 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define

    其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...

随机推荐

  1. MongoDB 2: 安装和使用

    导读:上篇博客中简单介绍了MongoDB,本篇文章主要是介绍Mongo的安装和使用(环境为win8).(PS:这是一篇没什么技术含量的文章,仅是个人的笔记式文档)下一篇博客,将介绍Mongo使用过程中 ...

  2. HTML转义字符集合

    readme:这次可以不readme了,因为这个是我copy过来的~ ISO Latin-1字符集:  — 制表符Horizontal tab  — 换行Line feed  — 回车Carriage ...

  3. meta 标签属性(网站兼容与优化需要)

    概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务. —— W3School ...

  4. zedboard如何从PL端控制DDR读写(三)——AXI-FULL总线调试

    之前的项目和培训中,都只用到了AXI-Lite或者AXI-Stream,对于AXI-FULL知之甚少,主要是每次一看到那么多接口信号就望而却步了. 现在为了调试DDR,痛下决心要把AXI-FULL弄懂 ...

  5. .net分页控件webdiyer:AspNetPager

    首先下载:AspNetPager.dll   AspNetPager.xml  放到bin目录下 页面添加<%@ Register Assembly="AspNetPager" ...

  6. 使用C#三维绘图控件快速搭建DXF查看程序

    本例使用AnyCAD .Net三维图形控件快速实现一个DXF文件的读取.显示.导出JPG.PNG.PDF的应用. 代码: using System; using System.Collections. ...

  7. 使用SE16N_INTERFACE

    调用函数直接修改table数据             在PRD上通常没有权限 但是可以激活sap内置的修改模式     SE16N 修改表数据.增加.删除行项目: 1. Execute tcode ...

  8. VS2013添加NuGet的方法

    1.工具->扩展和更新->联机 2.右上角搜索框搜索NuGet,选择NuGet Package Manager for Visual Studio 2013,安装后重启VS 下面通过添加N ...

  9. ie8以下不兼容document.getElementsByName解决方法

    在IE8以认为只有文本标签才有name属性的,一些元素标签用document.getElementsByName获取不到DOM,如DIV,span等,这里做一下兼容. HTML: <div na ...

  10. Knockout.Js官网学习(简介)

    前言 最近一段时间在网上经常看到关于Knockout.js文章,于是自己就到官网看了下,不过是英文的,自己果断搞不来,借用google翻译了一下.然后刚刚发现在建立asp.net mvc4.0的应用程 ...