解析const

    • 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

时间: 2024-10-30 22:40:08

解析const的相关文章

nodejs解析url参数的三种方法

要解析的url:http://127.0.0.1:8090/?name=cpc&age=21 利用js字符串操作函数进行解析 const myserver = require("http"); const urlib = require("url"); var myfs = require("fs"); myserver.createServer(function (req,res){ console.log(req.url); res.

【UNIX环境高级编程】文件 IO 操作 - 基础函数 open close creat lseek write read 详解

博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) open 函数简介 open 函数解析 : -- 函数定义 : #include <fcntl.h> int open(const char *path, int oflag, ...); -- 函数作用 : 打开或者创建一个文件; -- 返回值 : 打开文件成功, 返回文件描述符; 如果失败, 返回

yii2框架随笔29

今天我们来看UrlRule.php <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\web; use Yii; use yii\base\Object; use yii\base\InvalidConfigException;

高阶组件

前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只不过传入的参数变成了react组件,并返回一个新的组件. A higher-order component is a function that takes a component and returns a new component. 形如: const EnhancedComponent = higherOrderComp

1、koa的安装,get和post方法的基础使用

koa是干什么:koa是用来解决回调嵌套的方案,减少异步回调,提高代码的可读性和可维护性同时也改进了错误处理( Express的错误处理相当糟糕) koa相比express的优点在哪里1.更加优雅简单的中间机制2.更加优雅简单的异步处理3.更加优雅简单的编程方式 一.安装和使用koa1.检查node版本,低于7.6是不支持的. 查找node安装位置命令行 : where node2.选择需要安装或操作的文件夹, npm init -y 生成.json文件npm i --save koa 二.ge

Flutter 布局(六)- SizedOverflowBox、Transform、CustomSingleChildLayout详解

本文主要介绍Flutter布局中的SizedOverflowBox.Transform.CustomSingleChildLayout三种控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. SizedOverflowBox A widget that is a specific size but passes its original constraints through to its child, which will probably overflow. 1.1 简介 光看

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

本文主要介绍Flutter布局中的LimitedBox.Offstage.OverflowBox.SizedBox四种控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. LimitedBox A box that limits its size only when it's unconstrained. 1.1 简介 LimitedBox,通过字面意思,也可以猜测出这个控件的作用,是限制类型的控件.这种类型的控件前面也介绍了不少了,这个是对最大宽高进行限制的控件. 1.2 布局行

Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解

本文主要介绍Flutter布局中的Baseline.FractionallySizedBox.IntrinsicHeight.IntrinsicWidth四种控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Baseline A widget that positions its child according to the child's baseline. 1.1 简介 Baseline这个控件,做过移动端开发的都会了解过,一般文字排版的时候,可能会用到它.它的作用很简单,

Flutter 布局(二)- Padding、Align、Center详解

本文主要介绍Flutter布局中的Padding.Align以及Center控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Padding A widget that insets its child by the given padding. 1.1 简介 Padding在Flutter中用的也挺多的,作为一个基础的控件,功能非常单一,给子节点设置padding属性.写过其他端的都了解这个属性,就是设置内边距属性,内边距的空白区域,也是widget的一部分. Flutter