最近打算整理一下 C++ 的知识点,在 github 上搞一个项目,美其名曰“AboutCPlusPlus”,项目地址:https://github.com/CPythoner/AboutCPlusPlus
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数。
对于基本的数据类型,修饰符 cosnt 可以在类型说明符前,也可以用在类型说明符后面,其结果是一样的。
const int a = 5;
int const b = 5;
const int arr1[3] = {1,2,3};
int const arr2[3] = {1,2,3};
来看一些对 const 变量的操作:
const int a = 10;
a = 11; // 错误:不能为 const 变量赋新值
int &b = a; // 错误:不能为 cosnt 变量绑定 non-const 引用
const int &c = a; // 正确
int *d = &a; // 错误:不能为 const 变量绑定指向 non-const 的指针
const int *e = &a; // 正确
const 与 define 宏定义的区别:
const 修饰指针变量有三种情况:
const int *p = 8;
const 修饰指针内容,即 *p 的值不可变,只能为8。因为 const 位于 * 的左边,称为左定值。
int a = 8;
int* const p = &a;
*p = 9; // 正确
int b = 7;
p = &b; // 错误
对于 const 指针 p 其指向的内存地址不能改变,但其内容可以改变,称为右定向,因为 cosnt 位于 * 右边。
int a = 8;
const int* const p = &a;
这时 p 只想的内容和指向内容地址都已固定,不可改变。
const 修饰类的成员变量,表示该成员为常量,不能不修改,只能在初始化列表中赋值。
class A
{
…
const int nValue; //成员常量不能被修改
…
A(int x): nValue(x) { } ; //只能在初始化列表中赋值
}
const 修饰类的成员函数,表示该成员函数不能修改类中的任何非 const 成员变量,一般 const 卸载函数的后面,比如 void func() const;
。
如果有个成员函数想修改对象中的某一个成员变量,可以使用 mutable 关键字修饰这个成员变量:
#include<iostream>
using namespace std;
class Test
{
public:
Test(int _m,int _t):_cm(_m),_ct(_t){}
void Kf()const
{
++_cm; // 错误
++_ct; // 正确
}
private:
int _cm;
mutable int _ct;
};
int main(void)
{
Test t(8,7);
return 0;
}