c++ const用法总结

c++ const用法总结

Date: 2021-08-15

总结

  1. 类的 const 成员设置值时, 声明就设置初始值(c++11后的语法), 或是在初始化列表(initializer list)设置
  2. const 声明类的实例时, 只能调用类的 const 修饰的方法; 但也可更改定义为 mutable 的数据成员;
  3. const 修饰指针, 还是修饰指向的值;视 * 位置定.
    1. *const 之前, 如 int * const ptr, 则 const 修饰的是指针本身;
    2. *const 之后, 如 const int * ptr, 则 const 修饰的是指针指向的值;

const 成员初始化

// [[ 1 ]]
class ConstTest
{
private:
    const int a = 9; // 这是 C++11 后的语法
    const int b;
    // ...
public:
    ConstTest() : b(11) { // 通过初始化列表(Initializer List)设置 const 成员 b 的值
        // ...
    }
    // ...
};

声明类的 const 实例

注: 本处修改 mutable 成员, 未找到相关的资料作说明, 只是 g++ -std=c++11 -Wall (版本是g++ (GCC) 11.2.1 20210728 (Red Hat 11.2.1-1)) 能编译过去了, 不知是否是未定义的行为, 需自行斟酌取舍!!!

class ConstTest
{
private:
    // ...
    int c;
    mutable int d; 

public:
    mutable int pubD;
    mutable int pubMutD;

public:
    // ...
    void print() const { // 表示本方法不会更改实例 (this)
        std::cout << "a: " << a << std::endl
                  << "b: " << b << std::endl
                  << "c: " << c << std::endl
                  << "d: " << d << std::endl;
        // c = 20; // 这里就会报错, 因是 const 方法
    }
    void setC(int v) {
        c = v;
    }
    void setD(int v) const {
        d = v;
    }
};

int main(void)
{
    const ConstTest cct;
    cct.print();
    // cct.setC(333); // 这里会报错, const 实例, 不能调用更改自身(非const)的方法
    cct.setD(333); // 但这里没问题, 因是 const 方法
    cct.print();
    // cct.pubD = 99; // 这也会报错
    cct.pubMutD = 99; // 没问题
    // ...
    return 0;
}

使用 const 声明指针

    // 当 const 用于指针
    double d = 8;
    const double cd = 18;

    const double * cdp1; // const 修饰的是指向的值, 指针本身可变, 指向的值不可变
    double const * cdp2; // const 修饰的是指向的值, 与上一行 cdp1 的声明同等
    double * const cdp3 = &d; // const 修饰的是指针, 指针本身不可变, 但指向的值可变


    cdp1 = &d; // 指针本身可变,
    cdp1 = &cd; // 指针本身可变,
    cdp2 = cdp1; // 指针本身可变
    // *cdp1 = 99; // 本语句是错误的, cdp1 声明限定了指向的值不可变
    // cdp3 = &cd; // 本语句是错误的, cdp3 是 const 指针, 指针本身不能变
    *cdp3 = 99; // 但 cdp3 指向的内容可变

本节 const 修饰指针的内容, 我记得以前查资料, 在博客园见过博文写过一个很简易的助记方式,
* 出现有 const 的前后的位置作区分:

  1. * 号在 const 之前, 如 int * const ptr, 则 const 修饰的是指针本身;
  2. * 号在 const 之后, 如 const int * ptr, 则 const 修饰的是指针指向的值;

参考

posted @ 2021-08-15 20:59  陈tseesing  阅读(118)  评论(0编辑  收藏  举报