C++总结之const限定符

C++中为防止程序更改我们不希望更改的变量的值,用关键字const对变量的类型加以限定。

C语言中const和C++中const的区别:


C语言中const表示的意思是只读,即不允许改变其值,但是并没有要求不能通过改变他的地址所指向的内容来改变其值,C++对这一缺陷进行了一定的修改,即通过其地址也无法改变其值。

例:

include<stdio.h>
int main(){	
const int i=1;	
int* p=&i;	
printf("%d\n",*p);	
i=2;	
printf("%d",i);	
return 0;
}

结果:编译不通过,提示const对象不允许更改

但是:

#include<stdio.h>
int main(){	
const int i=1;	
int* p=&i;
printf("%d\n",*p);	
*p=2;	
printf("%d",i);	
return 0;
}

结果:编译通过。显示i的结果更改为2。

同样情况下的C++:

#include<iostream>
using namespace std;
int main(){
	const int i=1;
	int * p=&i;
	cout<<*p<<endl;
	*p=2;
	cout<<i<<endl;
	return 0;
}

结果:编译不通过,因为p的类型是const int * 而非 int *。

所以,在C语言中通常是用宏,但是在C++中很少会用到宏,C++中主要是用const和inline函数来代替C语言中的宏,学习过C语言的人都知道,C语言中的宏很不容易掌握,经常容易出问题。


C语言中经常用#define来定义常量,与C++中const相比有什么不同?

两者都是定义常量,但是const有更多的优点: 

1.const常量有数据类型,宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误; 

2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏变量进行调试。

const修饰指针

下面介绍一下初学者经常会弄混淆的,const修饰指针的情况,一般有一下4种情况:

int b=100;
const int* a=&b;  //情况1
int const *a=&b;   //情况2
int* const a=&b;   //情况3
const int* const a=&b;   //情况4

其实区别只在于const是在* 的左边还是在* 的右边。如果const是在* 的左侧,则const是用来修饰指针所指向的变量,即指针指向为常量;如果const是在* 的右侧,则const就是修饰指针本身,即指针本身是常量,因此,情况1和情况2是一种情况。都不允许对其所指向的内容更改。

情况3为指针本身是常量,这种情况不允许对指针本身做修改,但是指针所指向的内容不是常量。

情况4就是指针本身是常量,其所指向的内容也是常量。

另外C++中会经常看到的引用类型,引用的本质其实就是指针,const修饰的情况与指针几乎情况相同,这里不做介绍。

const成员函数

在C++中我们经常会在类的成员函数声明时,碰到这种形式:

class ABC{
  int a;
  int* p;
public:
  ABC(int data,int *q):a(data),p(q){}  /*关键字const必须用同样的方式重复出现在函数实现里,否则编译器会把它看成一个不同的函数 */
 void print()const  {    cout<<a<<endl;  }
};


这样用const修饰的成员函数是“只读”成员函数,这个成员函数不允许改变成员变量。一旦在这个成员函数中修改了成员变量的值,编译器会报错。

如果const出现在函数开头,如下所示:

const int insert(const int a){
...
}

则表示,函数的返回值类型为const int 型。

另外,对于函数传入形参带const修饰符时,可以保护实参不会在函数中被改变。一般这种情况下传入的实参有三种形式:1、实参为const修饰的常量。2、数值。3、临时值,例m+n,m和n为普通变量。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值