- C中const的用法
- C++中const的用法
- 用法一
- 用法二
- const的本质
- 与const有关的另外几个关键字
- mutable
- constexpr
- constinit和consteval
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有关的另外几个关键字 mutablemutable是用来突破const成员函数的限制的,就是你可以单点地突破,选择一两个特殊的成员变量,设置为可以改变的。
constexpr这个本质上是一种优化,就是利用编译时的计算能力,增加运行时的效率。你加了这个关键字就意味着你允许编译器去优化,比如你要算一个乘,那就不用在运行时再算了,而是在编译时就帮你算好了
constexpr int multiply(int x, int y)
{
return x * y;
}
const int val = multiply( 10 , 10 ); //在编译时就会计算了
constinit和consteval
这两个是C++20才出的,和constexpr差不多,都是为了提高效率用的



