目录
const 关键字
const 是 Constant(常量)的简写,有 3 大作用:
- 修饰常量,说明该常量的数值不可以被改变;
- 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
- 修饰形参,指向常量的形参(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
修饰常量
定义常量:下述两种方式效果一致,通常使用后者。
TYPE const ValueName = value;
// or
const TYPE ValueName = value;
注:当 conse 定义的常量是一个 “外部连接” 时,可以不进行初始化,仅仅作为声明,编译器认为该常量在程序的其他地方进行了定义。
extern const int ValueName = value;
进行类型检查:const 定义的常量必须具有数据类型,而 #define 定义的宏常量是没有数据类型的。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。所以,强烈建议使用 const 进行常量的定义。
void func(const int i) {}
// 对传入的参数进行类型检查,不匹配时进行提示。
节省内存空间:避免不必要的内存分配,const 定义的常量从汇编的角度来看,只是给出了对应的内存地址,而不像 #define 那般给出的是立即数,所以,const 定义的常量在程序运行过程中只有一份拷贝,而 #define 定义的常量在内存中有若干个拷贝。
#define Pi1 3.14159 // 常量宏
double I=Pi1; // 编译期间进行宏替换,分配内存
double J=Pi1; // 再进行宏替换,又一次分配内存!
const doulbe Pi2=3.14159; // 此时并未将 Pi 放入 ROM 中
double i=Pi2; // 此时为 Pi 分配内存,以后不再分配!
double j=Pi2; // 内存没有再次分配
提高了效率:编译器通常不为普通 const 定义的常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
修饰指针
这是一个非常容易造成混淆的写法,不推荐。
- 指向常量的指针(pointer to const)
const char* pContent;
- 自身是常量的指针(常量指针,const pointer)
char* const pContent;
- 两者都不可变
const char* const pContent;
区别的方法:以 *
号为分割线
- const 位于左侧时,const 用于修饰指针所指向的变量,即指针指向为常量;
- const 位于右侧时,const 用于修饰指针本身,即指针本身是常量。
修饰函数形参
修饰函数的形式参数:防止意外的修改,增强程序的健壮性。即避免了拷贝,又避免了函数对值的修改。在函数中定义形参时,建议使用 const 显式声明一个常量形参,传递过来的实参在函数体是不可以改变的。
- 传入的参数在函数体内不可以改变
void func(const int i)
{
i = 10; // 如果在函数体内修改了 i,编译器就会报错。
}
- 传入的指针参数所指内容为常量不可变
void function(const char* Var);
- 传入的指针参数本身为常量不可变
void function(char* const Var);
修饰函数返回值
其实用的并不是很多,它的含义和 const 修饰普通变量以及指针的含义基本相同。
- 返回一个整型常量
const int fun()
- 指针函数返回的指针指向的数据为常量不可变
const int* fun()
- 指针函数返回的指针自身为常量不可变
int* const fun()
转载:https://blog.csdn.net/Jmilk/article/details/106866712
查看评论