C和C++const的区别以及判断const用法正确与否

C与C++中const用法的区别

C语言

概念

  const是一个C语言的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助

用法

  C中const修饰的变量称作常变量,处理机制是在编译阶段,判断这个常变量是否作为左值,如果作为左值则会报错,除过这个其他处理和变量是一样的。例如下面代码,只有a=20;这一语句会报错,其余语句都是正确的。

int main()
{
	const int a;
	a = 20;//报错
	int *p =&a;
	*p = 20;
	printf("a:%d\n",a);
	return 0;
}

C++语言

概念

  const 限定符,它把一个对象转换成一个常量

用法

  C++中const修饰的变量称为常量,即可以将修饰的变量作为数组长度(int arr[a];)处理机制是在编译阶段,把用到常量的地方替换成了常量初始化的数值。

注意事项
  1. 一定要初始化,如下代码我们通过调试会发现在执行完*p=20;这一行后会显示a的值为20
    在这里插入图片描述但是在我们真正执行后会打印出a:10
    在这里插入图片描述
    会出现这样的原因是因为在C++中被const修饰的变量在编译阶段已经将所有用到a的地方替换为常量10,所以在运行阶段真正运行的是cout<<“a:”<<10<<endl;这一语句,因为我们要在编译阶段将用到的变量进行替换所以一定要进行初始化。
int main()
{
	const int a = 10;
	int *p = (int*)&a;
	*p = 20;
	cout<<"a:"<<a<<endl;//cout<<"a:"<<10<<endl;
}
  1. 杜绝间接访问来修改常量内存的风险
 int main()
{
	const int a = 10;
	//int *p = &a;//报错,杜绝风险
	const int *p = &a;//改为这样便正确
	*p = 20;
	cout<<"a:"<<a<<endl;
}

进行分析可知const修饰a,则直接访问为a,间接访问a都为*p,所以为了杜绝访问修改常量内存的风险,在 *p前面加上const即可。

判断const用法的正确与否

  • 根据大小权限的判断,如下代码我们可以发现&a类型为int *,p类型为int *const,这是其中int *权限大于int *const权限也就是我们所说的权限缩小,所以这行代码是正确的。接下来q的类型为int *这是用大权限指向小权限也就是我们常说的权限扩大,这是不允许的,按道理说这行代码会出错。但是,最终结果并没有报错
int main
{
 	int a = 10;
	int *const p = &a;      
	cout<<typeid(p).name()<<endl;
	int *q = p;
}

接下来我们分析一下,加上typeid§.name()这一行代码获取p的类型。经过打印我们发现p的类型并不是我们所想的int *const,而是如下图所示的int *。
在这里插入图片描述
所以当有笔试题出现这样的情况我是不建议去用权限判断来做的。

其实如果我们用C++中const中的第2个注意事项来判断会更加合理些,即杜绝间接访问来修改常量内存的风险,我总结的分析步骤如下:

  1. 找到const修饰的对象,然后从这行代码往下开始逐句分析。
  2. 判断const修饰对象的直接访问量。
  3. 判断对直接访问量的间接访问量。
  4. 如果间接访问量没有加const修饰我们加上const关键字即可。

接下来我们来分析一下上面的这道例题。

  1. const修饰对象为p
  2. 直接访问量为p
  3. 间接访问量无。因为p为一级指针所以其间接访问量至少要达到二级指针。

通过以上分析我们可以发现并无间接访问来修改常量内存的风险
,所以说代码是正确的。

为了加深印象我们再分析一道例题

int main
{
 	int a = 10;
	int *p = &a;
	const int ** q = &p;
	//改为const int *const* q = &p或者
	//int const* p = &a;
}
  1. const修饰对象为**q
  2. 直接访问量为a
  3. 由于下面没有代码了所以很多人以外没有间接访问量了,其实不然。当前行还包含了一个隐藏的间接访问量*q。

在这里插入图片描述
  我们通过模拟内存指向可以发现*q=&a,即 *q间接访问了a,所以我们在 *q前面加上const关键字即可。而且我们可以发现 *q=&a与上一行的int *p=&a是一样的所以在 *p前加上const也是可以的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的const函数是指在函数的参数列表后面加上const关键字,表示该函数不会修改所操作的对象const函数可以用来保护对象的数据成员,确保在函数调用期间它们不会被修改,从而提高程序的健壮性和安全性。 const函数有两种用法: 1. 在函数定义的时候,在函数的参数列表后面加上const关键字,表示该函数不会修改它所操作的对象: ```cpp class MyClass{ int data; public: void func() const; }; void MyClass::func() const{ // 不能修改data成员变量 // 只能读取data成员变量 } ``` 2. 在函数声明的时候,在函数的参数列表后面加上const关键字,表示该函数不会修改它所操作的对象: ```cpp class MyClass{ int data; public: void func() const; }; void MyClass::func() const; ``` 在使用const函数时,需要注意以下几点: 1. const函数只能调用const函数和const成员函数,不能调用非const函数和非const成员函数。 2. const函数不能修改成员变量的值,也不能调用修改成员变量的函数。 3. const函数可以访问非const成员变量和非const成员函数。 4. 对于类中的常量成员变量,只能在初始化列表中初始化。 ```cpp class MyClass{ const int data; public: MyClass(int d): data(d) {} // 初始化列表中初始化常量成员变量 void func() const; }; ``` 总之,const函数可以提高程序的健壮性和安全性,建议在设计类的时候尽可能使用const函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值