如下为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. uitableviewcell高度自适应笔记

    今天看了几篇uitableviewcell高度自适应的文章,大体分为两种方式. 第一种方式,cell里面有label,在cellforrow绘制的时候计算Label的可能高度,并且在此时重新计算cel ...

  2. [JFinal 1] JFinal和SSH中使用拦截器的对比

    导读:先前在做.NET项目时,拦截的功能主要是依靠缓存session来实现.当需要跳转到某个页面,使用某个功能查询一些数据时,会根据session中的用户值来判断是否已经正常登录,如果没有,则重定向到 ...

  3. ubuntu多网卡绑定

    这是最近碰到这个问题,需要将两张网卡绑定,共用一个IP,实现冗余效果.实际上linux双网卡的绑定模式有7中,而在这里常用的是 active-backup linux有七种网卡绑定模式:0. roun ...

  4. oracle 游标示例

    declare iCount int:=0; sPath nvarchar2(200); tdzsh nvarchar2(50);begin for x in (select c.imgpath fr ...

  5. Loadrunner:场景中添加负载生成器

    场景中添加负载生成器: (1)远程机子(假设ip为192.168.134.23)开启负载生成器 开始菜单找到:LoadRunner Agent Process 开启后任务栏会显示如下图: (2)场景中 ...

  6. IIS7 配置URL_REWRITE

    webconfig 文件 system.webServer节点下配置rewrite 报错 是因为需要安装URL重写 需要安装: https://www.microsoft.com/zh-cn/down ...

  7. WP8.1 添加启动画面

    1.新建WP8.1工程,将需要设置为启动画面的图片添加到工程中,并且重命名为splash-Phone-sdk.png(必须命名为该名字). 2.在工程中有Package.appxmanifest,双击 ...

  8. 基于CSS+dIV的网页层,点击后隐藏或显示

    一个基于CSS+dIV的网页层,用JavaScript结合Input按钮进行控制,点击后显示或隐藏,网页上常用到的特效之一,实用性较强,相信对大家的前端设计有帮助. <!DOCTYPE html ...

  9. NSBundle UIImageView &UIButton

    1.NSBundle 1> 一个NSBundle代表一个文件夹,利用NSBundle能访问对应的文件夹 2> 利用mainBundle就可以访问软件资源包中的任何资源 3> 模拟器应 ...

  10. CentOS 6 lnmp环境脚本

    实验环境:CentOS 6.3 32位 首先我们先去下载nginx的第三方yum源 mkdir /shell cd /shell wget http://www.atomicorp.com/insta ...