- const即constant的缩写,它是定义只读变量的关键字,或者说它是定义常变量的关键字。
虽然const定义的是变量但又相当于常量,说它是常量又有变量的属性,所以叫常变量。
const定义的变量是不允许改变的,不允许给他重新赋值,必须在定义的时候赋值。
2.const关键字作用
- const用于定义常量,const定义的常量编译器可以对其进行数据静态类型安全检查
- const修饰函数形参,当输入参数为用户自定义参数和抽象数据类型时,应该将值传递转换为const&传递,可以提高效率。因为值传递需要进行变量的复制占用空间与时间,而使用引用传递不会产生临时对象可以提高效率。
- const修饰函数的返回值,如给指针传递的函数返回值加const则返回值不能被直接修改,且返回值只能复制给加const修饰的同类型指针。
- const修饰类的函数成员,任何不会修改数据成员的函数都应用const修饰,这样当不小心修改了数据成员或调用了非const成员函数时,编译器会报错。
- 使用const可以保护被修饰的东西防止被意外修改,增强程序的健壮
3.const关键字的用法
-
const修饰局部变量
-
1 const int n=5; 2 int const n=5;
两种写法一样,都表示变量n的值不能再改变了。
-
const char* str="sadbha"
如果没有const修饰我们可以修改str[2]='g'这样的赋值语句,这样的操作会导致对只读内存区域的赋值,然后程序会停止。有了const,这个错误就会在编译的时候检查出来。
-
-
指针常量与常量指针
- 常量指针:指指针指向的内容是常量
- 指针常量:指指针本身是个常量,不能再指向其他的地址
-
const int *p; //p可变,p指向的内容不可变 int const *p; //p可变,p指向的内容不可变 int *const p; //p不可变,p指向的内容可以变
记忆与理解方法:const离哪个近就是修饰哪个的 第一个const修饰*p
第二个const修饰*p
第三个修饰p -
1.对于常量指针,是不能通过这个指针修改变量的值,但是可以通过其他的引用修改变量的值。
2.常量指针指向的值不可以变但常量指针可以指向其他的地址。
-
-
1 int a=5; 2 const int *n=&a; 3 a=6;
-
1 int a=5; 2 int b=6; 3 const int *n=&a; 4 n=&b;
-
-
const修饰函数的参数
- const修饰函数的参数,则是不希望这个参数值被函数体内意外改变时而使用。例如void Fun(const int i);则是告诉编译器i 在函数体中不能被改变,从而防止了一些无意的或者是错误的修改。
- 当输入参数为自定义数据类型时可以将值传递改变为“const&”传递,这样可以改为引用传递,而且加了const后还不会改变变量的值
-
const修饰函数的返回值
- 给指针传递的函数返回值加const则返回值不能被直接修改,且返回值只能复制给加const修饰的同类型指针。
-
1 const char *GetString(void); 2 3 char *str=GetString(); //出现错误只能赋值给加const修饰的同类型指针 4 const char *str=GetString; //不会出现错误,正确。
4.const 与#define区别
- #define预编译指令只是对值进行简单的替换,#define定义的对象没有数据类型,所以编译器不会对其进行类型安全检查
- const定义的是一个变量,常变量,有数据类型,编译器会对其进行类型安全检查
- #define定义的宏在编译后就不存在了,他不占用内存,系统只会给变量分配内存。而const定义的常变量具有变量的属性,有类型,占用内存。
- 使用const可以保护被修饰的东西防止被意外修改,增强程序的健壮性。
- const修饰全局变量存储在只读数据段,第一次使用时为其分配内存空间,程序运行结束后释放
- const修饰局部变量存储在栈中,代码块运行结束释放
- 使用const变量可以节省空间减少不必要的内存分配
- 使用const变量提高了效率。编译器通常不会为普通的const变量分配内存空间,而是将他们保存在符号表中,这是使得他它成为一个编译期间的常量,没有了存储与都内存的操作,效率比较高。