现在的位置: 首页 > 综合 > 正文

关于const

2013年10月13日 ⁄ 综合 ⁄ 共 994字 ⁄ 字号 评论关闭

根据const修饰的类型不同,它实现着不同的功能,最简单的就是定义常量。在c中用得比较多的是使用#define来定义常量,使用宏来定义常量和使用const定义常量主要有以下几个区别:
首先,const支持类型检查,而#define不支持。
其次,const定义的类型和其他变量一样,都是有局域限制的,即有作用范围,而宏定义的作用范围是从定义开始到程序结束,当然也可以使用#undef来结束定义
另外:在C和C++中,const使用的方法又不尽相同
在c中像下面这样的代码是无法编译过去的:
const int n=10 ;
int a[n] ;
//这主要是ansi c规定的,n是一个不可变的变量,但本质仍让还是变量,所以用gcc编译会报错这个数组的围度是可变的,但是这段代码在c++中却是值得提倡的,因为c++就认为此时n是一个常量
另外在c中下面的代码是不会有错误的:
const int n = 10;
int * p = &n ;
*p = 20 ;
//在c中只是定义了n是不可变的变量,但是却可以通过其他的方法去修改它的值,但是这段代码在c++中是编译报错的
因此在c中多用#define来定义常量,但是在c中使用宏定义一定要注意括号的使用,不然很容易掉下陷阱,比如
#define value 10
#define sum  value + 20
当想进行value * sum时候时实际的结果变成了 10 * value  +  20,好的编程风格是#define sum (value+20)
而在c++中尽量使用const 和enum来定义常量,用inline代替#define来定义函数
在这里介绍下c++中const定义常量的方法:
const char * p ;  //*p是常量,但p的值可以变,即它可以指向其他的地址;
char *const  p ; // p的值不可变,但是*p的值是可变的
const char * const p; //两者都不可变
除了定义常量外,const还可以用来修饰函数的形参,被const修饰的形参的值不可变,即它是一个输入值,不能作为输出值。
const放在函数返回值类型前,表示函数的返回值是不可变的,而且它只能赋值给const类型,比如说下面的代码是会报错的:
const int get_value() ;
int a = get_value();
另外在类的成员函数定义后面加上const表示,这个函数不允许修改类的成员变量的值,如果函数有这样的行为,编译的时候就会报错。

抱歉!评论已关闭.