• 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引用;  
        转载自:http://blog.csdn.net/clozxy/article/details/5679887

解析const的更多相关文章

  1. Express无法解析POST请求的JSON参数

    在用Express和MongoDB搭建后端开发环境时,可能会利用测试工具发送带有JSON格式数据的POST请求,那么这时就要利用request.body获取json数据,但此时可能遇到json无法解析 ...

  2. nodejs解析url参数的三种方法

    要解析的url:http://127.0.0.1:8090/?name=cpc&age=21 利用js字符串操作函数进行解析 const myserver = require("ht ...

  3. 深入浅出 Vue.js 第九章 解析器---学习笔记

    本文结合 Vue 源码进行学习 学习时,根据 github 上 Vue 项目的 package.json 文件,可知版本为 2.6.10 解析器 一.解析器的作用 解析器的作用就是将模版解析成 AST ...

  4. 模块化管理工具兼打包工具 webpack

    webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...

  5. 一个超级简单的node.js爬虫(内附表情包)

    之所以会想到要写爬虫,并不是出于什么高大上的理由,仅仅是为了下载个表情包而已-- 容我先推荐一下西乔出品的神秘的程序员表情包. 这套表情包着实是抵御产品.对付测试.嘲讽队友.恐吓前任的良品, 不过不知 ...

  6. Node.js系列-http

    前言: 最近一直忙着公司项目的事,战友们的留言也没空回复,博客也有段时间没有更新了,年底了就是一个的忙啊~~~(ps:同感的也给个赞吧) 现在前端的就是一直地更新一直有新的东西出来,什么ES2015, ...

  7. node框架koa

    node的两大常见web服务器框架有express和koa,之前已经介绍过express了现在来介绍下koa吧~ koa也是express团队的出品,意在利用es7新出的async来告别"回 ...

  8. 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...

  9. Flutter 布局(五)- LimitedBox、Offstage、OverflowBox、SizedBox详解

    本文主要介绍Flutter布局中的LimitedBox.Offstage.OverflowBox.SizedBox四种控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Limited ...

随机推荐

  1. 构造 hihocoder 1257 Snake Carpet (15北京I)

    题目传送门 题意:贪吃蛇,要求长度奇数的蛇转弯次数为正奇数,长度偶数转弯次数为正偶数,且组成矩形.(北大出的题咋都和矩形相关!!!) 分析:构造找规律,想到就简单了.可以构造 宽:(n + 1) / ...

  2. ural 1218. Episode N-th: The Jedi Tournament

    1218. Episode N-th: The Jedi Tournament Time limit: 1.0 secondMemory limit: 64 MB Decided several Je ...

  3. BZOJ3886 : [Usaco2015 Jan]Moovie Mooving

    f[i]表示用i集合内的电影可以达到的最长时间 f[i]向f[i|(1<<j)]更新,此时的时间为第j部电影在f[i]前的最晚上映时间 先排序一遍离散化后用前缀最大值解决 时间复杂度$O( ...

  4. TYVJ P1036 统计数字 Label:坑!!!(用queue+map做出来的水)

    背景 NOIP2007年提高组第一题 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数 ...

  5. salt-ssh使用

    salt-ssh 是 0.17.0 新出现的一个功能,一听这名字就知道它是依赖 ssh 来进行远程命令执行的工具,好处就是你不需要在客户端安装 minion,也不需要安装 master(直接安装 sa ...

  6. git实用攻略

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 下面是实用教程,免基础. 一.安装git https://git-scm.com/downloads 二.git创建 ...

  7. java的包装类(转)

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...

  8. 根据CSV找出USBGroup中计算机对应的用户

    <USB.CSV> Hostname,Username CNHZPD-TEST1,User1 CNHZLN-01234567,User2   $group = "CN=Enabl ...

  9. JSP简单访问数据库

    Java代码 public class DBHelper { private String driverName; private String url; private String user; p ...

  10. scapy 安装及简单测试

    关于scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比如 ...