c++ const用法总结
c++ const用法总结
Date: 2021-08-15
总结
- 类的
const
成员设置值时, 声明就设置初始值(c++11后的语法), 或是在初始化列表(initializer list)设置 - 用
const
声明类的实例时, 只能调用类的const
修饰的方法; 但也可更改定义为mutable
的数据成员; const
修饰指针, 还是修饰指向的值;视*
位置定.*
在const
之前, 如int * const ptr
, 则const
修饰的是指针本身;*
在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
的前后的位置作区分:
- 若
*
号在const
之前, 如int * const ptr
, 则const
修饰的是指针本身; - 若
*
号在const
之后, 如const int * ptr
, 则const
修饰的是指针指向的值;
参考
- [1] https://stackoverflow.com/questions/21476869/constant-pointer-vs-pointer-to-constant#
- [2] C++ primer 6th
- [3] 记不网址的博客园博文.