C和C++中的const
2019-05-13 本文已影响0人
秦素先生
author: 冰小苏打
const 必须初始化
const 作用
1.修饰变量,说明该变量值不可以被改变2.修饰指针,分为指向常量的指针和指针常量;3.常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改(严格来说并不存在常量引用,因为引用不是一个对象)4.修饰成员函数,说明该成员函数内不能修改成员变量。
C中const
严格来说C中的const是假的const
//常量 a 不能改变
const int a = 12;
a=18; //错误
int *p1 = &a;//c中普通指针可以指向常量
printf("a:%d\n", a); //12
//间接修改a的值
*p1 = 13;
printf("a:%d\n", a); //13
// c中的const 是伪const
int b = 16;
//指向常量的指针 p3指向地址的内容不能变
const int * p2 = &b;
*p2 = &b; //错误,编译不通过,指向地址的内容不能变
p2 = &a; //可以,改变指向的地址
//类似。可以使用2级指针改变p2的指向地址的内容
//so c中的const 是伪const
int * const p3 = &b; //指针常量 p2 不能改变指向的地址
*p3 = 18; //可以,改变指向地址的内容
p3 = &b; //错误,编译不通过,不能改变指向的地址
//类似。可以使用2级指针改变p3的指向的地址
//SO c中的const 是伪const
SO c中的const 是伪const
C++中const
//初始化
const int a =12;
const int b = a;
int c =13;
const int d = c;
const int e = sizeof(a);
const int f = get_size();
a = 18; //错误,常量不可变
//错误,a是常量,只能使用常量指针指向和C不用
int *p2 = &a;
//OK 使用常量指针指向
const int * p3 = &a;
//错误,这是一个常量指针
int * const p4 = &a;
//ok 指向常量的常量指针,指针本身和指向地址的内容都不可变
const int * const p5 = &a;
常量引用
- 经常用于形参类型
//常量引用,严格来说C++并不存在常量引用,因为引用不是一个对象
const int &aa = a;
aa++; //错误,不能改变
//用于形参类型
//减少参数传递过程中的变量的拷贝
int add(const int &a, const int &b)
{
return a+b;
}
修饰成员函数
class A
{
public:
int a = 12;
int b = 13;
int modify_a() const
{
this->a = 18;//错误,const 函数不能对成员进行修改
this->b = 20;//ok mutable 修饰的成员不受const函数的限定。
}
int modify_b() const
{
this->a = 18;//错误,const 函数不能对成员进行修改
}
int const modify_c() const 修饰的是函数的返回值为const
{
this->a = 18;//OK
this->b = 18;//OK
}
};
顶层const,底层const
- 顶层const表示指针本身是个常量,它的值(指向的地址)不能变。•底层const表示指针指向的是常量,它指向的地址空间的值不能变。
constexpr 变量
- 申明为constexpr的变量一定是一个常量, 在编译期间就能得到的值。
更多内容欢迎关注公众号:冰镇小苏打