1、为什么搞出const关键字?

  const指定一个语义约束,指定一个对象不可修改。如果一个对象不可修改,就应该说出来。

2、const与指针

  const可以修饰指向之物,也可以修改指针本身。STL中的迭代器是对指针的封装,因此,迭代器也有两个概念:指向常量对象的迭代器和常量迭代器。

  vector<int>::const_iterator; //指向常量的迭代器

  const vector<int>::iterator; // 常量迭代器

3、const可以与方法产生关联,可以用在方法前,方法中(形参表中),方法后。首先考虑,用在方法前,表示返回值是常量。为什么要返回const对象呢?

  我们知道,方法返回值是一个临时对象,只有类型,没有名称,这个临时对象是方法内局部对象的副本。如果返回不是一个常量,客户端就能实现下面的暴行:

  Rational a,b,c;

  (a*b)=c; //对方法返回值进行赋值。

  对于内置类型,这样的赋值行为是错误的。对于自定义类型,也应该报错。有一个准则要遵守:自定义类型应该和内置类型在行为上保持一致,除非有特殊情况。因此,为了避免客户端对方法返回值进行赋值,请返回一个const对象。

4、const在方法中,也就是出现在形参表中,这种情况很好理解,表示形参不可修改。需要注意的是:形参表不同,可以构成过载。如果形参表相同,只是常量性不同,能否构成过载?能不能构成过载的关键是:编译器能不能根据实参确定调用哪个方法,也就是过载方法的匹配程度不一样。

  如果形参是引用或者指针,可以构成过载,这种情况下,形参是实参的别名,根据实参的常量性,可以确定调用哪个方法。

  如果形参不是引用或者指针,不能构成过载,这种情况下,形参是实参的副本,与实参没有了关系,他们和实参的匹配程度是一样的。

5、const在方法后,表示常量方法,应该尽量使用常量方法。有两个好处:a、接口容易理解,明确表示不会修改对象内容;b、使得const对象可以调用。

  考虑,我们知道non-const对象可以调用const成员方法,但是,const对象不能调用non-const成员方法,因为non-const成员方法可能会修改对象。为了让const对象调用non-const成员方法,有两种办法:一是使用const_cast<T&>或者const_cast<T*>去除对象的常量性,二是如果不修改对象,使用const成员方法,显然第二种办法更好。

6、根据成员方法的常量性,可以过载。为什么?我们知道成员方法有个隐式的常量this指针(不能指向其他对象),const成员方法限制了this指针指向const。因此,编译器可以根据方法拥有者的常量性,决定哪个方法更匹配。

7、如果返回对象的内部数据,const成员方法应该返回const引用,防止外部修改,non-const成员方法应该返回non-const引用。这里特别注意一点,内置类型的临时对象是不可修改的(exception的临时对象是可以修改的),也就是说,内置类型的临时对象不能赋值给non-const引用,考虑一下为什么?

  方法返回对象的内部数据,返回值不是引用,而是内部数据的副本。第一个理由上面讲了,防止客户端对返回值赋值,第二个理由是,如果返回值不是const,就可以赋值给non-const引用,程序员用这个引用期望修改对象内部数据,是办不到的,这个时候修改的是临时对象,这往往不是程序员所期望的。

8、返回对象的内部数据,const成员方法为什么返回const引用?

  我们知道,const成员方法的语义是说,不修改对象。但是由于暴露了内部数据,自己承诺不修改,但是由于自己的原因,暴露了内部数据,导致外部可以间接修改对象(我不杀伯仁,奈何伯仁因我而死)。为了避免这种情况,返回const引用,限制外部也不能修改。

9、在有些极端情况下,const成员方法也要修改对象的一部分内部数据,但是我又不想把它设计成non-const成员方法,因为non-const成员方法可以修改对象内的任意数据。这种情况下,可以使用mutable修饰字段,明确表示这些字段可以在const成员方法中修改。

10、对于过载的const成员方法和non-const成员方法,做的事情一样,只不过一个返回const引用,一个返回non-const引用,如何避免代码重复呢?

  就是让一个方法调用另一个方法,让non-const成员方法调用const成员方法,这里要做两个强制转化,首先使用static_static<const T *>,把常量this指针转化为指向常量对象的常量this指针,然后使用const_cast<T&>,去除返回值的常量性。

  注意:不能反向调用,也就是说,不能使用const成员方法调用non-const成员方法,因为后者可能修改对象内容。

【03】尽可能使用const的更多相关文章

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

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

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

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

  3. 条款03 尽可能使用const

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

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

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

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

    场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...

  6. 条款03:尽可能使用const

    目录 1. 总结 2. const对象 3. const函数返回值和函数参数 4. const成员函数 const成员函数的重要性 bitwise constness logical constnes ...

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

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

  8. 尽可能使用 const

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

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

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

随机推荐

  1. 1319-n皇后问题

    描述 在n×n 格的棋盘上放置彼此不受攻击的n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一 ...

  2. POJ 1404 I-Keyboard (DP)

    http://poj.org/problem?id=1404 题意 :手机上的要发短信的话,“我”字需要先按一下9键,再按3下6键,所以,现在想要重新布局每个键上的字母数,让最后的那个值最小,也就是说 ...

  3. UVA 11294 Wedding

    给n对夫妇安排座位,其中0h,0w分别表示新郎,新娘.同一对新郎,新娘不能坐在同一侧,而且互为通奸关系的人不能同时坐在新娘对面. 这道题目真是掉尽节操啊,,,欧美的氛围还是比较开放的. 分析: 首先说 ...

  4. *[codility]MaxCounters

    http://codility.com/demo/take-sample-test/maxcounters 简单题.注意要记录两个max,一个是最大值,一个是已经生效的最大值. // you can ...

  5. Linux下的绘图(流程图、UML、mindmap)工具

    http://blog.csdn.net/piyajee/article/details/5902380

  6. ANDROID_MARS学习笔记_S01原始版_007_Handler及线程的简单使用

    一.运行结果 一.代码1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...

  7. USB Type-C,接口上的大统一?

    这款 24-pin 连接器的机械设计反应了设计人员从 Micro-B 连接器上获得的历史教训,它无需确定插入的正反方向并可实现 10000 次的插拔.使用者再也不需要担心“哪头上,哪头下”,因为 US ...

  8. 如何用AndroidStudio导入github项目

    最近一直在研究AndroidStudio,但是总会有这样那样的问题,特别是在github上看到一个很好地开源项目,想clone下来用用,就会出现很多蛋疼的问题,今天摸索着,结合一些大牛们的建议,轻轻松 ...

  9. [译]GotW #5:Overriding Virtual Functions

       虚函数是一个很基本的特性,但是它们偶尔会隐藏在很微妙的地方,然后等着你.如果你能回答下面的问题,那么你已经完全了解了它,你不太能浪费太多时间去调试类似下面的问题. Problem JG Ques ...

  10. libvlc 双击,鼠标事件消息响应

    基于vlc 2.1 动态库实现接收双击消息的接收,使双击vlc播放画面可以全屏显示. 需要其他版本的vlc可以与我联系(有偿进行修改) 下载地址:http://download.csdn.net/de ...