• 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. MVC WEB安全——XSS攻击防御

    XSS(跨站脚本攻击) 描述: 原理:攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到攻击用户的特殊目的. 类别: 1)被动注入(Passive Inj ...

  2. PNG无损压缩工具Optipng【备忘】

    Optipng 是专门的 PNG 图像优化工具. 支持WINODWS.LINUX 地址:http://optipng.sourceforge.net/ 另:jpegoptim 优化 jpeg 图片 地 ...

  3. git 基于发布分支的开发

    创建发布分支: (1) 软件hello-world的1.0发布版本库中有一个里程相对应. /home/jackluo/workspace/user1/workspace/hello-worldgit ...

  4. FileStorage Read String Start With Number Need Quotation Mark 读取数字开头的字符串需要加引号

    // Write data FileStorage fs("test.yml", FileStorage::WRITE); fs << "MyString&q ...

  5. virt-manage图形界面键盘错位问题

    键盘错乱问题: 启动引导问题:

  6. ACM对时间掌控力和日积月累的习惯的意义

    马云说,要想创业成功,不是要知道现在什么东西最火,而是要清楚的知道十年以后什么东西最火.这就意味着,你对时间掌控力,至少要有十年. 但是仔细回想一下自己的学生时代,自己对时间的把握是怎样的?有些人只能 ...

  7. mysql中的comment用法

    转自:http://wenku.baidu.com/view/2a54e7892cc58bd63186bd8f.html 在MySQL数据库中,字段或列的注释是用属性comment来添加. 创建新表的 ...

  8. Java接口、Java抽象类、C++抽象类的区别

    由于这三种数据类型都是为了创建类层次结构的顶层构架,且用法有些许相似之处,这里简单区分一下: 接口: 接口用interface关键字定义, 名字一般使用-able形式的形容词. 接口通常定义抽象方法和 ...

  9. html 实体转换为字符:转换 UEditor 编辑器 ( 在 ThinkPHP 3.2.2 中 ) 保存的数据

    在 ThinkPHP 3.2.2 中使用 UEditor 编辑器保存文章内容时,数据库中保存的数据都被转义成实体,例如:&lt;p&gt;&lt;strong&gt;& ...

  10. ubuntu&FAQ

        转自-笨小孩 查看进程: ,ps -e 命令 ,feng@feng:~$ sudo netstat -antup Active Internet connections (servers an ...