历史上最全的const用法总结

2024-07-18 13:14:04 浏览数 (1)

如果知道我会死在哪里,那我将永远不去那个地方 -查理 芒格

缘起

其实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);

0 人点赞