C++中的const的简单说明

const修饰符

在C语言中,习惯使用#define来定义常量

#define LIMIT 100
  • 实际上,这种方法只是在预编译时进行置换,把程序中出现的标识符LIMIT全部置换为100。在预编译以后,程序中不再有LIMIT这个标识符。LIMIT不是变量,没有类型,不占存储单元,而且容易出错。
  • C++提供了一种更加灵活,更安全的方式来定义常量,即使用const修饰符来定义常量
const int LIMIT=100;

这个常量LIMIT是有类型的,占用存储单元,有地址,可以用指针指向它,但不能修改它


const也可以与指针一起使用,它们的组合情况较复杂,可以归纳为3中情况: * 指向常量的指针 * 常指针 * 指向常量的常指针
指向常量的指针

指向常量的指针是一个指向常量的指针变量

const char* name="yaroo";//声明指向常量的指针

上面的代码的意思是声明一个名为name的指针变量,它指向一个字符型变量,初始化name为指向字符串"yaroo"
由于使用了const,不允许改变指针所指地址中的常量,因此下面的代码是错误的

name[2]='a';//出错,因为不允许改变指针所指的常量

但是,由于name是一个指向常量的普通指针变量,不是常指针,因此可以改变name所指的地址。(相当于前面的const只能限制住"yaroo"的内容是是不能改变的,但是name这个指针指向"yaroo"这个事情不是固定的,也就是name指针和"yaroo"之间的关系不是固定的)
下面的操作是允许的:

name="linus";//合法的,可以改变指针所指的地址

该语句赋给了指针另一个字符串的地址,即改变了name的值

常指针

常指针是指把指针所指的地址,而不是它所指的对象声明为常量,例如:

char* const name="yaroo";//常指针

上面的代码做的是声明一个名为name的指针变量,该指针变量是指向字符串的常指针,用"yaroo"的地址来初始化该常指针
也就说,name指针指向了一个字符串这个事实是不能改变的,但是这个字符串里面放的东西是可以改变的

name[0]='z';//合法的,可以改变指针所指的数据
name="linus";//不合法,不能改变指针所指的地址
指向常量的常指针

指向常量的常指针是这个指针本身不能改变,它所指的地址中的数据也不能改变。要声明一个指向常量的常指针,二者都要声明为const

const char* const name="yaroo";//指向常量的常指针

上面的代码声明了一个指向常量的常指针,它是一个指向字符型常量的常指针。

说明:

  • 如果用const定义的是一个整型常量,关键字int可以省略,所以下面的两种写法都是合法的
const int LIMIT=100;
const LIMIT=100;
  • 常量一旦被建立,在程序的任何地方都不能再改变
  • 与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C++的编译程序可以进行更加严格的类型检查,具有良好的编译时的检测性。
  • 函数的形参与可以用const说明,用于保证形参在该函数内部不能被改动,大多数C++编辑器对具有const参数的函数进行更好的代码优化。例如,希望通过函数i_Max求出整型数组a[200]中最大值,函数原型是:

int i_Max(const int* ptr);

调用时的格式可以是:
```C++
i_Max(a);

这样做的目的是确保原数组中的数据不被破坏,即函数中对数组元素的操作只许读而不许写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值