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 修饰符

猜你喜欢

转载自blog.csdn.net/DreamSonGO/article/details/79716641