zoukankan      html  css  js  c++  java
  • C++中const的用法

    本文是个人针对《C++ Primer(第5版)》的个人理解和网上相关博文整理而成。若有不妥处欢迎留言指出,谢谢!

    一、const与普通变量、指针和引用

    1、const修饰普通变量

    希望定义一种变量,其值不被改变。写法如下:

    1 const Type var=Tvalue;    //Type为(内置或别的)类型

     使用的注意点是:因为const对象一旦创建后其值不能在改变,所以const对象必须初始化。

    2、const与指针和引用

    (1)与指针

    与指针的结合中,const的位置不同,导致的含义也不同。这里省略初始化的考虑,仅给出等号左侧的形式。(初始化时,等号右侧或花括号中的值或变量要和等号左侧相匹配)

    1 const double *p;                //情况1
    2 double *const p;                //情况2
    3 const double *const p;          //情况3

     (a)情况1,指针p指向的是一个double常量(指向常量的指针),即不能通过指针p去改变其指向对象的值,但没有规定那个对象不能通过其他的途径改变(其他途径是什么不觉明历)。

    1 const double pi=3.14;        //pi为常量
    2 const double *p=π         //p指向一个双精度常量
    3 *p=42.1;                     //错误,不能给*p赋值

     这里值得注意的是允许一个指向常量的指针指向一个非常量对象(和常量引用一样),即等号两边类型不匹配(特例)。

    1 double dval=3.14;
    2 p=&dval;                //正确!!但不能通过指针p(为上段代码中)改变dval的值

     (b)指针本身为常量,即常量指针,常量指针,指针本身的值不变,故必须初始化。情况2,p为指向double的常量指针。常量指针并不意味着不能通过指针去修改其指向对象的值,能否这样做完全依赖所指对象的类型。

    1 double num=3.14;
    2 double *const p=#
    3 *p=0.0;     //可以通过p修改num的值
    4 
    5 //p为指向常量对象的常指针,则不能。如:
    6 const double num1=3.14;
    7 const double *const p=&num1;
    8 *p=2.72;        //错误

     注:情况1和情况2的区分方法,关键看const和*的位置关系:

    如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即为指向常量的指针;
    如果const位于*的右侧,const就是修饰指针本身,指针本身是常量,即为常量指针。

    (c)情况3,是情况1和2的混合,即,指针和其指向的对象都不可变。

    (2)与引用

    因为引用不是对象,所以没有常量引用(类似指针中的情况2),只有对常量的引用(类似指针的情况1)。

    1 const double dval=3.14;
    2 const double &r=dval;
    3 r=4.2;      //错误,r为对常量的引用,和指针中情况1类似

     对const的引用可能引用一个并非const的对象(和指针的情况1一致)

    1 double dval=4.2;
    2 double &r=dval;          //正确
    3 const doulbe &r1=dval;        //正确!但不能通过r1改变dval的值

     注:这里和指针情况1有点不同的是,引用一旦初始化,就不可改变引用对象。详见博文指针与引用

    二、修饰函数参数

    1、表示函数体中不能修改参数的值,包括参数本身的值和参数其中包含的值。

    1 double func(const double *var) ;    //参数为指针指向的内容为常量,不可变

     2、和引用结合

    使用引用做形参的好处是避免拷贝。当不会改变形参时,利用const和引用结合避免形参被改变,另外,使用引用而非常量引用也会极大地限制函数所能接受的实参类型。例如,我们不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。

    1 double func(const double &var);    //var既可以是常量也可以非常量

     三、const修饰成员函数

    使用const的成员函数称为常量成员函数。

    1 struct Sales_data
    2 {
    3     string isbn() const {return bookNo;}    //const的用法
    4     .....
    5 }
    6 
    7 Sales_data total;
    8 total.isbn();

     成员函数通过一个名为this的额外的隐式参数来访问它的那个对象。默认情况下,this的类型是指向类类型非常量版本的常量指针。这里是,Sales_data *const。尽管this是隐式的,但它仍然需要遵循初始化规则,意味着(在默认情况下)我们不能把this绑定到一个常量对象上(见上面的一种的(2))。这样使得我们不能在一个常量对象上调用普通的成员函数。在isbn函数体内不会改变this所指的对象。(不改变this指针本身,也不改变其指向对象,类似于一中情况(3))。因为this是隐式,所以在函数体前加上一个const来实现这个目的。

    注意两点:

    (1)常量成员函数不能修改任何成员变量(mutable修饰的变量除外);

    (2)常量成员函数不能调用非constconst成员函数,因为非const成员函数可以修改成员变量。

    四、const此时函数返回值

    const修饰函数返回值不多见,其含义和const修饰普通变量及指针含义相同。

    1 const int *func1();
    2 const int *p=func1();       //调用
    3 
    4 int const *func2();
    5 int const *p=func2();       //调用

    Ref:

    http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html

    http://www.cnblogs.com/xudong-bupt/p/3509567.html

  • 相关阅读:
    Java 泛型
    Github
    软件工程----前端
    前端全局缓存的三种方式
    关于IDE的选择
    模拟placeholder
    小程序request封装
    小程序实现大转盘抽奖----踩坑之路
    关于this的理解
    小程序背景图片bug
  • 原文地址:https://www.cnblogs.com/love-yh/p/7360078.html
Copyright © 2011-2022 走看看