加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_安阳站长网 (https://www.0372zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

详解C/C++中const关键字的用法及其与宏常量的比较

发布时间:2020-12-30 16:27:42 所属栏目:创业 来源:网络整理
导读:副标题#e# 1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性。 即它所修饰的变量不能被修改。 2.修饰局部变量 const int a = 10; int const b = 20; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用const修饰变量时,一

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,以为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样方式不必要的以为修改,使用的方法与局部变量是相同的。

8.const常量与宏常量的区别

(1).便于进行类型检查

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)。

//例子:
 void f(const int i) { .........} //对传入的参数进行类型检查,不匹配进行提示

(2)可以节省空间,避免不必要的内存分配

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

#define PI 3.14159   //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
    ......
 double i=Pi; //此时为Pi分配内存,以后不再分配!
 double I=PI; //编译期间进行宏替换,分配内存
 double j=Pi; //没有内存分配
 double J=PI; //再进行宏替换,又一次分配内存!

(3)提高了效率 

 宏定义是一个“编译时”概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束于编译时期。const常量是一个“运行时”概念,在程序运行时使用,类似于一个只读数据。

编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高

(4)可以保护被它修饰的东西

防止意外的修改,增强程序的健壮性。

void f(const int i) { i=10;//error! } //如果在函数体内修改了i,编译器就会报错 

(5)为函数重载提供了一个参考

 class A
 {
   ......
 void f(int i)  {......} //一个函数
 void f(int i) const {......} //上一个函数的重载
   ......
 };

(6)定义域不同

 void f1 ()
 {
  #define N 12
  const int n 12;
 }
 void f2 ()
 {
  cout<<N <<endl; //正确,N已经定义过,不受定义域限制
  cout<<n <<endl; //错误,n定义域只在f1函数中。若想在f2中使用需定义为全局的
 }

(7)做函数参数

   宏定义不能作为参数传递给函数;const常量可以在函数的参数列表中出现。

9.const_cast

const_cast运算符用来修改类型的const或volatile属性。

(1)常量指针被转化成非常量的指针,并且仍然指向原来的对象;

(编辑:网站开发网_安阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读