在C++语言中,有时候需要使用常量,这里的常量是指广义的常量,包括const变量、const函数、const指针、const数组等等。常量,具有只读属性,即一旦已经初始化,就只可读取,无法修改,类似于只读光盘一样,值已经写进常量区,只可读取,无法二次写入。
1 const常量
const常量,可以是一个整形常量,比如,const int a = 3; 表示a是一个等于3的整形常量,a的值是只读的。
const int a = 3; //整型常量
const float pi = 3.14 //圆周率pi,单精度常量
const double e = 2.718 //自然对数e,双精度常量
- 圆周率pi =3.1415926535897932384626…, 它一个无理数,即无限循环小数,常用三角函数、弧度/角度之间的换算,通常取小数点后2位,即pi≈3.14,可以把pi定义为const,表示不可修改。
- 自然常数e=2.71828182845904523536…,它也是一个无理数,常用于复利计算、求导等,通常取3位,即e≈2.718,把它定义为const,也是合理的。
2 const函数
const函数,若它在类中,表示常函数,不能修改类的成员变量。常函数主要用于获取类的属性、特定计算。比如,一个矩形类Shap定义如下:
class Shape
{
public:
Shape(int x,int y)
:m_x(x)
,m_y(y)
{
}
int GetArea() const //获取面积
{
return m_x * m_y;
}
int GetX() const //获取x
{
return m_x;
}
int GetY() const //获取y
{
return m_y;
}
private:
int m_x;
int m_y;
};
int GetArea() const 表示获取矩形的面积,x是宽度,y是高度,那么矩形面积就是 x*y。由于面积不涉及对宽度、高度的修改,只是读取宽度、高度这些属性,所以将GetArea()函数用const修饰,是合理的。
3 const指针与const value
当const 与*一起修饰变量时,有如下3种情况:
组合 | pointer | value | 说明 |
---|---|---|---|
const int* pNum1 | 地址可变 | 值不可变 | const修饰的是value |
int* const pNum2 | 地址不可变 | 值可变 | const修饰的是pointer |
const int* const pNum3 | 地址不可变 | 值也不可变 | 前一个const Type*,是修饰value;后一个const p是修饰指针 |
- 对pointer来说,可变,是指pointer的指向,可以从指向A地址,改成指向B地址;
- 对value来说,可变,是指value的值,可以更新,比如从10,更新到30;
3.1 const int* pNum1
const int* pNum1,表示地址可变,值不可变,如下:
int numA = 10;
const int* pNum1 = &numA; //value是const的,pointer不是const
//1) value是const的,pointer不是const
*pNum1 = 20; //编译报错,因为value = *pNum1是const的,不能修改值
int numB = 50;
pNum1 = &numB; //正常,因为pNum1不是const,可以改变指向,从指向numA,改成指向numB;
pNum1是一个pointer,而*pNum1是一个value,通过语句const int* pNum1 = #,可知: pNum1是一个普通指针,可以改变指向 ;而value = *pNum1是一个常量,不可以修改。
3.2 int* const pNum2
int* const pNum2 表示值可变,地址不可变,如下:
int numA = 10;
int* const pNum2 = &numA; //pointer是const的,value不是cosnt
//2) pointer是const的,value不是cosnt
int numC = 60;
pNum2 = &numC; //编译报错,因为pNum2 = pointer,是const,不能修改地址;
*pNum2 = 70; //正常,因为*pNum2 = value,不是const,可以更新值,从10更新到70
pNum2是一个pointer,而*pNum2是一个value,通过语句int* const pNum2 = &numA; ,可知:
pNum2一个常量指针,不可以修改指向 ;而value = *pNum2是一个变量,可以更新值。
3.3 const int* const pNum3
const int* const pNum3 表示地址不可修改,值也不可以修改,如下:
int numA = 10;
const int* const pNum3 = &numA; //value是cost的,pointer也是const
//3)value是cost的,pointer也是const
int numD = 80;
pNum3 = &numD; //编译报错,因为pNum3 = pointer,是const,不能修改地址;
*pNum3 = 90; //编译报错,因为*pNum3 = value,也是const,不能更新值
pNum3是一个pointer,而*pNum3是一个value,通过语句const int* const pNum3 = &numA;,可知: pNum3是一个常量指针,不可以修改指向;同时,*pNum3也是一个常量,不能更新值。
4 const数组
当需要把一些固定的元素或者字段,放在一起时,既可以使用枚举,也可以使用const数组。比如,把三原色:red、green、blue,放在一起,形成一个常量数组arry[3]。
const std::string arry[3] = {"red","green","blue"}