• const在函数前与函数后的区别

    • 一   const基础   
          
        如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:   
          
        int   b   =   500;   
        const   int*   a   =   &b;              [1]   
        int   const   *a   =   &b;              [2]   
        int*   const   a   =   &b;              [3]   
        const   int*   const   a   =   &b;   [4]   
          
        如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective   c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a   =   3   ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。   
        另外const   的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const   可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:a&   operator=(const   a&   a);   
        void   fun0(const   a*   a   );   
        void   fun1(   )   const;   //   fun1(   )   为类成员函数   
        const   a   fun2(   );   
          
        二   const的初始化   
          
        先看一下const变量初始化的情况   
        1)   非指针const常量初始化的情况:a   b;   
        const   a   a   =   b;   
          
        2)   指针(引用)const常量初始化的情况:a*   d   =   new   a();   
          const   a*   c   =   d;   
        或者:const   a*   c   =   new   a();   
        引用:   
          a   f;   
          const   a&   e   =   f;   //   这样作e只能访问声明为const的函数,而不能访问一般的成员函数;   
          
        [思考1]:   以下的这种赋值方法正确吗?   
        const   a*   c=new   a();   
        a*   e   =   c;   
        [思考2]:   以下的这种赋值方法正确吗?   
        a*   const   c   =   new   a();   
        a*   b   =   c;   
          
        三   作为参数和返回值的const修饰符   
          
        其实,不论是参数还是返回值,道理都是一样的,参数传入时候和函数返回的时候,初始化const变量   
        1   修饰参数的const,如   void   fun0(const   a*   a   );   void   fun1(const   a&   a);   
        调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const   a*   a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const   a&   a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。   
        [注意]:参数const通常用于参数为指针或引用的情况;   
        2   修饰返回值的const,如const   a   fun2(   );   const   a*   fun3(   );   
        这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。const   rational   operator*(const   rational&   lhs,   const   rational&   rhs)   
        {   
        return   rational(lhs.numerator()   *   rhs.numerator(),   
        lhs.denominator()   *   rhs.denominator());   
        }   
          
        返回值用const修饰可以防止允许这样的操作发生:rational   a,b;   
        radional   c;   
        (a*b)   =   c;   
          
        一般用const修饰返回值为对象本身的情况多用于二目操作符重载函数并产生新对象的时候。   
        [总结]   一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对 某个对象引用的情况。   
        原因如下:   
        如果返回值为某个对象为const或某个对象的引用为const   ,则返回值具有const属性,则返回实例只能访问类a中的公有数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用 到。   
          
        [思考3]:   这样定义赋值操作符重载函数可以吗?   
        const   a&   operator=(const   a&   a);   
          
        四   类成员函数中const的使用   
          
        一般放在函数体后,形如:void   fun()   const;   
        如果一个成员函数的不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大 大提高了程序的健壮性。   
        五   使用const的一些建议   
          
        1   要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;   
        2   要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;   
        3   在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;   
        4   const在成员函数中的三种用法要很好的使用;   
        5   不要轻易的将函数的返回值类型定为const;   
        6   除了重载操作符外一般不要将返回值类型定为对某个对象的const引用; 
       

const关键字详解的更多相关文章

  1. (转) C/C++中const关键字详解

    文章转自  http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...

  2. C++中const关键字详解

    1.什么是const? const意味着是常量类型,被const修饰的变量或对象是不能被修改和更新的,当然在某些情况下,我们可以偷梁换柱的改变它. 2.为什么要引入const? 最初的目的是为了取代预 ...

  3. Const 关键字详解

    const 标识符 在c++中作为常量修饰符 用来修饰 函数 变量  指针 const 修饰的变量不可以改变值 const 在修饰指针的时候 const 标识符出现在*的左边表示 指向的变量为常量不能 ...

  4. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  5. C++初学者 const使用详解

     关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文. 1. const常量 如: cons ...

  6. Java面试题04-final关键字详解

    Java面试题04-final关键字详解 本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查 ...

  7. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  8. Delphi、Lazarus保留字、关键字详解

    Delphi.Lazarus保留字.关键字详解 来自橙子,万一的博客以及其他地方 保留字:变量等标识符可以再使用: 关键字:有特定含义,不能再次重新定义: 修饰字:类似保留字的功能,也就是说可以重用 ...

  9. java关键字(详解)

    目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...

随机推荐

  1. $.getJSON(url,function success(){})回调函数不起作用

    有个问题好久没有解决,就是: $.getJSON(url,function success(){}) 其中的回调函数,总也不执行. 以前也做过,但那都是CTRL+C,CTRL+V,也没有细想. 目标就 ...

  2. lightoj Again Array Queries

    1100 - Again Array Queries   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 ...

  3. 去除List列表中反复值(稍作调整,也适合于List<T> 和 List<?>)

    方法一 循环元素删除 [c-sharp] view plaincopy public static void removeDuplicate(List list) { for ( int i = 0  ...

  4. IOS中的自动布局

    Autolayout是一种“自动布局”技术,专门用来布局UI界面 Autolayout能很轻松地解决屏幕适配问题 Autolayout的两条核心概念:   >1 参照:通过参照其他控件或父控件来 ...

  5. iOS系统原生二维码条形码扫描

    本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW.细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了.这个代码自己写就行了,与本文关系不大...绿色的 ...

  6. HDU 4548 美素数(打表)

    HDU  4548  美素数(打表)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H 题目 ...

  7. POJ 1458 Common Subsequence(LCS最长公共子序列)

    POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

  8. java执行windows 的cmd 命令

    //获取运行时 Runtime rt = Runtime.getRuntime(); //获取进程 Process p = rt.exec(String[] cmdarray);     或者   P ...

  9. Android Bug 记录

    1.Unable to resolve target 'android-5' 无法解析目标 ' 安卓系统-5'      Unable to resolve target 'Google Inc.:G ...

  10. 转:30分钟掌握STL

    三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有 ...