zoukankan      html  css  js  c++  java
  • C++中const小结

    1const修饰普通变量(非指针变量)
    const修饰变量,一般有两种写法:
    const TYPE value;
    TYPE const value;
    对于一个非指针的类型TYPE,这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是只读的。


    2、const修饰指针变量

    通用的准则:

    在没有括号的情况下:
    如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
    如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

    如下面四种写法中:
    A. const TYPE*pContent;
    B. TYPE const *pContent;
    C. TYPE * const pContent;
    D. const TYPE* const pContent;

    A、B都表示pContent所指向的内容为只读,而C表示pContent本身是只读的,D表示指针本身和所指向的内容都是只读的

    其中C的写法等价于const (TYPE * )pContent;

    这里说明下const 位于*左侧的指针指向为常量指的是指针指向的变量不能通过该指针改变,但该变量是可以通过其他方式改变的。有点拗口,看下面的程序吧

    #include<iostream>
    using namespace std;
    int main()
    {
        const int *p;
        int *q;
        int a[5]={1,2,3,4,5};
        p=a;
        q=a;
        //(*p)++;//这句话会报错,因为p是const修饰的指针,其指向的内容不能通过p改变
        (*q)++;  //q是一个普通指针,尽管他和p指向同一个地址,却可以通过该指针改变指向的内容
        cout<<*p;
        return 0;
    }

     
    3、const修饰函数参数

    const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值)。
    void function(const int Var); //传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

    void function(const char* Var); //参数指针所指内容为常量不可变

    void function(char* const Var); //参数指针本身为常量不可变(也无意义, 因为char* Var也是形参)

    参数为引用,为了增加效率同时防止修改。

    修饰引用参数时:

    void function(const Class& Var);//引用参数在函数内不可以改变

    void function(const TYPE& Var); //引用参数在函数内为常量不可变


    4、 const 修饰函数返回值

    const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。

    (1) const int fun1() 这个其实无意义,因为参数返回本身就是赋值。

    (2) const int * fun2()

    调用时 const int *pValue = fun2();

    我们可以把fun2()看作成一个变量,指针内容不可变。

    (3) int* const fun3()

    调用时 int * const pValue = fun2();

    我们可以把fun2()看作成一个变量,即指针本身不可变。

    5、const修饰成员函数

    const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
    class A

    {

       …

    void function()const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。

    }

    对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用


    6、 const修饰类对象/对象指针/对象引用

    const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

    const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。

    例如:

    class AAA

    {
       void func1();

    void func2() const;

    }

    const AAA aObj;

    aObj.func1(); ×

    aObj.func2(); 正确



    const AAA* aObj = new AAA();

    aObj->func1(); ×

    aObj->func2(); 正确

     

    7、const修饰成员变量

    const修饰类的成员变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。


    class A

    {

       …

       const int nValue;       //成员常量不能被修改

       …

       A(int x): nValue(x) {}; //只能在初始化列表中赋值

    }

    声明:本博文部分转载自 月光林地的博文http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html

    还看到了一个关于const的很不错的博文http://blog.csdn.net/Eric_Jo/article/details/4138548

  • 相关阅读:
    Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
    Ubuntu16.04进入挂起或休眠状态时按任何键都无法唤醒问题解决办法
    Ubuntu16.04+Gnome3 锁定屏幕快捷键无效解决办法
    A start job is running for Raise network interface(5min 13s )问题解决方法
    Ubuntu16.04 “有线未托管”有线网络不可用问题解决
    A start job is running for Network Manager wait online (29s / no limit) 等待30s解决办法
    Linux 串口终端调试工具minicom
    Linux 终端仿真程序Putty
    Oracle:在 debian9 上完美安装 oracle 10.2.0.5 x64
    从debian9、ubuntu18.04的deb包依赖来看,似乎不是那么好!!
  • 原文地址:https://www.cnblogs.com/bewolf/p/4359216.html
Copyright © 2011-2022 走看看