如果知道我会死在哪里,那我将永远不去那个地方 -查理 芒格
缘起
其实const的用法在八股文系列的文章中很常见,但是总是过于零散,总结不是很全面,遂整理成文,以供大家享用,如果有不够全面还请大家补充,万分感谢。
const与变量
使用const修饰变量,表征变量本身不可变,具有如下的使用场景:
1. 定义常量,取代#define,
2. const修饰函数形参,强制该参数在函数内不可变。
3. const修饰函数返回值,表征函数返回值的const属性,该值不可改变。
代码语言:javascript复制const double PI = 3.14159265358979323846;
//#define PI 3.14159265358979323846
代码语言:javascript复制void func1(const int a)
{
}
void func2(const int b)
{
}
代码语言:javascript复制struct BigObj
{
};
const BigObj func()
{
BigObj obj;
return obj;
}
const与指针
1. 常量指针,即指针是常量,指针本身不可改变,指针指向内容可变
2. 指针常量,即指向常量的指针,指针指向内容为常量不可变,指针本身可变,
3. 常量指针常量,指针和指针指向内容均不可改变
常量指针和指针常量的叫法不一而足,各种解释也层出不穷。请参考如下示例代码理解记忆:const距离谁近,修饰的就是谁,谁不可变
代码语言:javascript复制 int a =10;
int b =20;
int c =30;
//常量指针
int * const const_ptr = &a;
//const_ptr = &b;//指针本身不可修改
*const_ptr = 50;//指针指向内容可以修改
//指针常量
const int* ptr_const1= &a;
//*ptr_const1 = 20;//指向内容为常量,不可修改
ptr_const1 = &b;//指针本身可变
int const * ptr_const2 = &a;
//*ptr_const2 = 20;//指向内容为常量,不可修改
ptr_const2 = &b;//指针本身可变
const int * const c_ptr_c = &a;//两者均不可变化
//*c_ptr_c = 30;
int c =60;
// c_ptr_c = &c;
const与引用
const修饰引用,常用于函数传参,可以减少对象的copy操作,尤其是针对复杂对象,可以增加效率
代码语言:javascript复制struct BigObj
{
};
void func(const BigObj& obj)
{
}
const与类
const修饰成员函数,保证函数内不会修改类的成员变量
代码语言:javascript复制class People
{
public:
People();
~People();
int getAge()const//不会修改成员变量
{
return m_age;
}
private:
int m_age;
};
const修饰的函数强制函数内部不可修改成员变量的值,当存在修改程序员变量的场景时,可以使用mutable修饰变量
代码语言:javascript复制 mutable int m_age;
const属性移除
C 提供运算符const_cast用于去除变量的const限定,用于类型转换,注意const_cast 中的类型必须是指针、引用或指向对象类型成员的指针。
代码语言:javascript复制const int constantValue = 5;
int& nonConstReference = const_cast<int&>(constantValue);