如下为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. .NET本质论(4)应用程序对象HttpApplication

    当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication.  在ASP.NET内部,HttpRuntime管理一个定 ...

  2. file not found while xcode archive

    今天碰到一个问题,就是我像在我的ios app中添加支付宝功能,按照文档我添加好了测试也成功,但是在archive的时候就是出问题,很奇怪.最后网上查了文档,最后在stackoverflow上面找到了 ...

  3. dell n2000 组播抑制

    http://en.community.dell.com/support-forums/network-switches/f/866/t/19677497 http://en.community.de ...

  4. C# 16进制与字符串、字节数组之间的转换(转)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...

  5. 如何判断raid1中哪块硬盘损坏?

    服务器 2块硬盘做的raid1,如果其中有一块坏掉,如何能判断是哪块坏掉? 方法①.通过硬盘硬件指示灯进行观察,一般黄灯代表硬盘存在问题,显示红灯则代表硬盘损坏.方法②.通过开机进入阵列配置进行查看, ...

  6. ORA-00031: session marked for kill 处理Oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  7. 学习java 第1天

    自己是刚刚开始自学java看了视频和书 =-=,刚开始我先对命令窗口进行了一个大体上的了解 ,首先是打开,可以右键开始键,然后选择命令提示符,我更喜欢第二种,就是使用Win+R,然后输入cmd进入,我 ...

  8. ASP.NET MVC5 高级编程 第2章 控制器

    参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...

  9. ref和out的区别?

    ref 和out的区别在面试中会常问到: 首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传 ...

  10. POJ C++程序设计 编程作业—类和对象 编程题 #2

    编程题 #2 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序的输出 ...