const在c程序和c++程序中的那点事

时间:2021-03-06 04:12:28

如果让你说说const有什么用途,你能说出来几种?今天就const在c语言和c++中的作用和区别谈谈~~~涉及的内容比较简单,所以各位路过的大神见笑了。。。

根据我的总结,在c程序中,const的用法主要有定义常量,修饰函数参数,修饰函数返回值等等。
在c++程序中,除包含c语言的用法外,const还可以修饰函数的定义体,定义类中某个成员函数为恒态函数,即不改变类中的数据成员。

来看看在c程序和c++程序中const的区别吧:
c程序中的const

  • 可以不初始化,被修饰的变量的值将不能修改
  • const修饰的变量叫常变量,不是普通意义上的常量(因为它不可以做数组的下标)
  • const修饰的常变量和普通的变量唯一的区别是常变量定义后不能作为左值存在
  • 常变量和普通变量的编译方式是一样的(反汇编代码是相同的,c++也相同)

c++程序中的const

  • 必须得初始化,被修饰的变量的值将不能修改
  • const修饰的变量是常量(因为它可以做数组的下标)
  • const的c++编译规则:所有使用常量名字的地方全部替换为常量的初始值,当引用一个编译阶段不明确的值的时候const常量退化为常变量
  • const修饰的变量属性为local,在const常量定义处加extern属性才变为global

从上面的总结中知道,如果想在c程序中使用const定义的变量去做数组的下标是不可能的,因为在c语言中,const被设计为“一个不能被改变的普通变量”,既然是普通变量就得占用内存。看以下c语言程序:

const int buffsize = 100;
char buf[buffsize];

看起来是没错,但是编译器会报一个buf未知大小的错误,主要是因为const修饰的buffsize占用内存的某个地方,所以c编译器不知道它在编译时的值。如果要在编译阶段就使用一个命名的变量的话,这就迫使程序员在预处理器里使用#define,下面说说const和#define的区别
主要区别有以下两点:

  1. const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,在字符替换的过程中会出现意料不到的错误(边际效应)
  2. 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。(宏常量在vs2013编译器中调试时没有对应的反汇编代码)