美文网首页C++
C++: const详解

C++: const详解

作者: 赵伯舟 | 来源:发表于2018-08-18 11:52 被阅读0次

    一、const变量

    const修饰一个变量,代表这个变量是个常量,不可改变:

        const int n = 1;
        n++; /// error
    

    二、const与指针

    1. 指向常量的指针
        const int * p1 = new int(2);
        *p1 = 3;        /// error
        p1 = new int(3);/// works
        *p1 = 4;        /// error
    

    如上,p1是一个指针,将其看成是(const int) * p1,可知其指向的内容是一个常量,所以*p1 = 3会报错,但是,这个指针可以指向别的变量,不过其指向的内容依然不可变

    2. 指针本身是常量
        int * const p1 = new int(3);
        (*p1)++;          /// works
        p1 = new int (4); /// error
    

    可以看成是int * (const p1),即p1是个常量,不可改变,但是p1指向的内容是可变的,所以(*p1)++能够正常运行
      自然,若是const int * const p1 = new int (0),则不管是指针本身,还是其指向的变量,都是不可变的。

    三、const与函数参数

    • void func(const int n):参数n是个常量,在函数里面不会被改变
    • void func(const int& n):按引用传值,且不会在函数体内被改变,比上一种方式好
    • void func(const int *p):指向常量的指针,其指向内容不会被改变
    • void func(int* const p):指针本身是常量,本身不会被改变

    四、const与类

    1.const修饰成员变量
    class Foo
    {
    public:
        const int n;
        const int * p;
        Foo(int _n = 0, const int * _p = nullptr) : n(_n), p(_p){};
    };
    

    const修饰成员变量,表示其为常量不可修改,注意其需在初始化列表里初始化

    2.const修饰成员函数
    class Foo
    {
    public:
        const int n;
        int m = 0;
        Foo(int _n = 0) : n(_n){};
        void func1()const 
        {
            m++;               /// error
            cout << n << endl;
            
            func2();          /// error
        }
        void func2()
        {
            m++;
        }
    };
    

    const作用于成员函数的形式为:void func()const,其表示不会在函数体内修改任何成员变量,那它怎么保证我们无法修改成员变量呢?,基于下面的规则:

    • const成员函数内只能调用const成员变量:非const成员变量无法被调用,所以修改不了,const成员变量能够被访问,但是其本身无法被修改
    • const成员函数不能调用非const成员函数:非const成员函数可能修改成员变量,所以禁止调用,而其他const函数因为不会改变成员变量,所以可以调用,“保证了纯正的血统” : P
    3. const修饰对象
        const Foo foo;
        
        foo.m ++;              /// error
        cout << foo.m << endl; /// works
        
        foo.func1();           /// works
        foo.func2();           /// error
    

    const修改对象,表示这个对象是个常量,里面的数据不能被修改,其限制基于下面规则:

    • 公有变量只可读,不可写
    • 该对象只能调用const成员函数
      const修饰对象指针也是同样的道理:
        const Foo * p1 = new Foo();
        p1->m++;               /// error
        cout << p1->m << endl; /// works
        
        p1->func1();           /// works
        p1->func2();           /// error
    

    相关文章

      网友评论

        本文标题:C++: const详解

        本文链接:https://www.haomeiwen.com/subject/vdaxiftx.html