const详解

定义:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

内存:C语言存储在堆栈和静态存储区(全局变量),C++可能存在符号表中,视情况而定。

读写属性:只读

主要作用:
1)可以定义const常量,具有不可变性。
2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则
已,一变都变!
4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
5)可以节省空间,避免不必要的内存分配。const定义的常量在程序运行过程中只有一份拷贝,而#define定义
的常量在内存中有若干份拷贝。
6)提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。(C++)。

意义:const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。


典型例子:
1.修饰局部变量
  const int n=5;
  int const n=5;
两种写法效果一样,都是不能再次赋值了。

2.修饰常量静态字符串
const char* str="abcdef";
如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是
const的好处。让逻辑错误在编译期被发现

3.修饰指针,常量指针和指针常量
常量指针写法:const int * n;int const * n;两个都是表示常量指针
常量指针指的是不能通过这个指针来改变变量的值,但是可以通过引用和指向其他地址来改变值。
int a=5;const int* n=&a;a=6;//通过引用来改变常量指针的值
int a=5;int b=6;const int* n=&a;n=&b;//通过指向地址来改变常量指针的值

指针常量的写法:int *const n;
指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的

指向常量的常指针:const int* const p;
是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的
普通指针改变变量的值。

4.修饰函数的参数
根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

1)防止修改指针指向的内容 void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数
体内的语句试图改动 strSource 的内容,编译器将指出错误。

2)防止修改指针指向的地址 void swap ( int * const p1 , int * const p2 )
指针p1和指针p2指向的地址都不能修改。

3)以上两种的结合。

5.修饰函数的返回值

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

例如定义函数:const char * GetString(void);
char *str = GetString();//出现编译错误
const char *str = GetString();//正确

6.修饰函数和对象(C++):int fun()const;
1)const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数。
2)如果 const 构成函数重载,const 对象只能调用 const 函数,非 const 对象优先调用非 const 函数
3)const 函数只能调用 const 函数。非 const 函数可以调用 const 函数。
4)类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值