C/C++中的const关键字解析

文章目录

    • C中const的用法
    • C++中const的用法
      • 用法一
      • 用法二
    • const的本质
    • 与const有关的另外几个关键字
      • mutable
      • constexpr
      • constinit和consteval

C中const的用法

const int *p;
int const *p;

这个两个是一样的,都是说指针指向的那个值是常量,而指针可以变,这种用法比较常见

int * const p;

这种是指那个指针是一个常量,这个指针指向的值可以变,这个本质上其实就是C++的引用,所以这种用法在C++中就很少用到了,因为一般要用,就直接用C++中的引用了

const int * const p;
int const * const p;

这个就是综合了前面两种,指针和指针所指向的变量都不能变,都是常量。这种用法不常见

C++中const的用法

C++里面多了两个const的用法

用法一

第一个就是在引用前面加const,然后去传参

发现一个细节,就是引用的话,什么都不用管,就是你在定义的时候给变量加一个&就可以了,其他的就按照正常变量来写,注意,一定要把引用和指针的写法完全分隔开,他们的写法完全不一样,不要搞混了

之前在输入输出型参数中有讲过,传参的时候,加了const就是说明是输入型参数,只是传进去不用改的,在C语言中传参就是这样

int fun1(const int *a)
{
    if(*a > 100)
        return 0;
    else
        return -1;
}

而在C++中你可以理解为这里它更倾向于使用引用,而使用引用可以完成上面的这个功能,而且在完成上面那个功能的同时,还多了一个功能,就是把指针也给变成常量了,而不单单是指针所指向的变量,这样就更明确地告诉了编译器,我这个就是输入型参数

int fun2(const int &a)
{
    if(a > 100)
        return 0;
    else
        return -1;
}

仔细去品这两个中指针和引用的区别,还有要有一个意识,就是意识到传参里面写的东西其实就是一个定义,所以上面那个是指针的定义,a就是定义了一个指针,那么用的时候,取里面的值就要加*p,而下面那个是引用的定义,引用的定义是C++经过封装了的,所以直接对应的就是那个变量了,很方便的,所以a直接就是那个变量了。所以综上,指针和引用的用法是完完全全不一样的,要完完全全分隔开来看

用法二

第二个就是const成员函数

struct A
{
public:
    int i;
    int j;
    int func10(void) const;
};


int A::func10(void) const
{
    this->i = 5;
}

你在这个成员函数的后面加上const,就说明这个成员函数里面是不会修改成员变量的值的,比如这里,是不会在这个func10中去修改这个成员变量i和j的,向上面那样写就会报错,因为你在成员函数里改了成员变量的值

const的本质

本质上是编译器在帮你保护,实际上物理上并没有设置成只读,只是在编译器层面帮你做了一个检查而已,因此后面想要强行改也是可以的。

与const有关的另外几个关键字

mutable

mutable是用来突破const成员函数的限制的,就是你可以单点地突破,选择一两个特殊的成员变量,设置为可以改变的。

constexpr

这个本质上是一种优化,就是利用编译时的计算能力,增加运行时的效率。你加了这个关键字就意味着你允许编译器去优化,比如你要算一个乘,那就不用在运行时再算了,而是在编译时就帮你算好了

constexpr int multiply(int x, int y)
{
    return x * y;
}
const int val = multiply( 10 , 10 ); //在编译时就会计算了

constinit和consteval

这两个是C++20才出的,和constexpr差不多,都是为了提高效率用的

你可能感兴趣的:(c++,c语言,开发语言)