• 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. Codeforces Round #331 (Div. 2)

    水 A - Wilbur and Swimming Pool 自从打完北京区域赛,对矩形有种莫名的恐惧.. #include <bits/stdc++.h> using namespace ...

  2. 游戏 标签gui.label

    using UnityEngine; using System.Collections; public class Gui : MonoBehaviour { public string str; p ...

  3. BZOJ1172 : [Balkan2007]Dream

    $\gcd(ab,k)=\gcd(\gcd(a,k)\times \gcd(b,k),k)$ 设$f[i][j]$表示前$i$行,与$k$的$\gcd$为$j$的方案数,$h[i]$表示当前行选一个或 ...

  4. HDU 2364 (记忆化BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2364 题目大意:走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往 ...

  5. 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...

  6. Codeforces Round #191 (Div. 2) E题

    状态压缩DP,算sum,本来是枚举的,结果TLE了.. #include <iostream> #include <cstring> #include <cstdio&g ...

  7. 【NOI2015】荷马史诗

    追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和& ...

  8. The constructor BASE64Encoder() is not accessible due to restriction on required

    在Eclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示: Access restriction : ...

  9. MySQL添加字段和修改字段的方法

    添加表字段 alter table table1 add transactor varchar(10) not Null; alter table   table1 add id int unsign ...

  10. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '??????' in 'field list'

    严重: Servlet.service() for servlet jsp threw exceptioncom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErro ...