C语言

const的理解和用法

时间:2025-01-17 01:44:41 海洁 C语言 我要投稿
  • 相关推荐

const的理解和用法

  const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。下面是小编精心整理的const的理解和用法,希望对大家有所帮助。

  一、关于const的具体定义:

  ——个人感觉很难对它下一个标准的定义,因为的用法很灵活,似乎对它定义后总无法让人能够明白它的意思,而且容易让人产生误解(也许是偶水平太菜了)。例如,把它有定义:一个能够让变量变成无法修改的常量的关键字。那么,这样的话,就可能让人误解为只要有const在定义变量里面,那变量就无论怎样都无法修改。这样的理解是很片面的(下面用法方面将对这问题做探讨)。因此,本人在此不敢对它下定义,其他参考书好象也没有下定义。

  二、关于const的具体作用

  ——const作用就灵活了,一个表达式中const放置的位置不同,效果可能就不一样了。下面分具体情况分析(当然,所举的情况并非覆盖全部情况)

  A、const最经常的用法

  1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.

  //Example ->

  int FindNum(const int array[], int num, int conut);//声明函数

  //code...

  int FindNum(const int array[], int num, int count)

  {

  int i;

  int flag = 1;

  for (i = 0; (i < count) && flag; i++)

  {

  if (array[i] == num)

  {

  flag = 0;

  break;

  }

  }

  return flag;

  }

  //code...

  上面这例子中,编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么,编译器就会报错了。因此,当你不需要也不想修改数组的数据时,最好用const把数组定义为常量数组。

  2.const可以用来创建数组常量、指针常量、指向常量的指针等:

  const char ch = a;

  const int a[5] = {1, 2, 3, 4, 5};

  const int *p = a; //a是一个数组的首地址.p是指向常量的指针

  int * const p = a; //a是一个数组的首地址.p是指针常量;

  const int * const p = a; //a是一个数组的首地址。p是指向常量的指针常量

  前两种情况很简单,现在着重分析一下后三种用法,因为这3种情况容易出错,偶就有时候怕用错了干脆不用const.

  ——const int *p = a;

  //p是指向常量的指针,因此,不可以通过给指针赋值来改变数组

  //中的数据,例如:

  // *p = 10;

  // *(p + 2) = 1;

  //假如指向常量指针可以改变值,那么,就等于也改变了数组的数

  //据了。假如你不理解,偶倒有一个办法让你理解,你就想你和一

  //个人绑在一起,有可能你移动了位置而他不跟着你移动吗!哈哈

  ——int * const p = a;

  //看这表达式,const的位置和第一个不同吧!他们的用法和作用

  //就完全不一样了。这时候p是指针常量,我们知道,指针是指向

  //了一个数组的首地址,那么,它的位置就不可以改变了。但是你

  //现在应该和第一个表达式比较了,现在的数组并不是常量数组,

  //所以数组的数据是可以改变的,而指针这时候它是不可以移动的

  //,指向数组第一个数据,所以它可以而且只可以改变数组第一个

  //数据的值。这一点请别误解,指针常量只是它的地址不可以改变

  //,并不是它指向的内容一定不可以改变,这一点切记!

  //好啦。假如你又不理解,偶又有一个比较形象的例子来说明:

  //假如有一个固定的人拉着另外一个人的手,注意,固定的人相当

  //于他是不可以由其他人来替换的。但是他可以拉其他人的手啊,

  //并不一定规定他必须拉同一个人的手啊。现在你应该可以有个比

  //较深的印象和理解吧:P

  //下面举几个例子帮助理解:

  // *p = 2;

  // *(p+1) = 10;

  // p++;

  ——const int * const p = a;

  //假如前面两种表达式的本质你理解了,这种表达式你来理解根本

  //没有问题,const现在有两个,而且一个const的位置是第一种情

  //况的位置,第二个const是第二种情况的位置,所以这表达式的功

  //能就是前两种情况的作用总合。这里不多说!

  //下面举几个例子帮助理解:

  // *p = 2;

  // *(p + 2) = 10;

  // p++;

  B。const并不会阻止参数的修改

  之所以把这作为一点来谈,就是因为有一些朋友可能会以为在函数参数中用了const就一定不可以改变

  参数,这实际上是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下;

  #include

  #include

  void ChangeStr(const char *String);

  int main(void)

  {

  char str[] = "The C programme";

  Change(str);

  printf(str);

  system("Pause");

  return 0;

  }

  void ChangeStr(const char *String)

  {

  char *Source = (char *)String;

  while (*Source)

  {

  *Source = toupper(*Source);

  Source++;

  }

  }

  //end

  上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。

  关于CONST的用法和理解本人也就只能说这么多了,当然,很可能有更多高级或者少用的用法,由于水平

  和经验有限,确实不能再说些什么。

  一、C++中const的作用和用法

  不考虑类的情况:

  const常量在定义时必须初始化,之后无法修改

  const形参可以接收const和非const类型的实参

  考虑类的情况:

  const成员变量:不能在类定义外初始化,只能通过构造函数的初始化列表进行初始化

  const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用,但不管怎么样都不能够修改非mutable修饰变量的值

  const 在编译阶段确定其值,它定义的常量占用静态存储区的空间,程序运行时只有一份,也可以进行调试

  优点:

  有数据存储类型,在定义式可进行安全性检查

  可调试

  占用较少的空间

  二、如何理解顶层const和底层const

  概念区分

  顶层const:指的是const修饰的变量本身是一个常量,无法修改,指的是指针,就是 * 号的右边

  底层const:指的是const修饰的变量所指向的对象是一个常量,指的是所指变量,就是 * 号的左边

  区分作用:

  执行对象拷贝时有限制,常量的底层const不能赋值给非常量的底层const

  使用命名的强制类型转换函数const_cast时,只能改变运算对象的底层const

  三、说说const关键字的的作用有哪些?

  阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了

  对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const

  在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值

  对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量,类的常对象只能访问类的常成员函数

  对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”

  const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员

  非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员

  一个没有明确声明为const的成员函数被看作是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。因此const对象只能调用const成员函数

  const类型变量可以通过类型转换符const_cast将const类型转换为非const类型

  const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有const类型的变量,那么该变量必须在类的初始化列表中进行初始化

  对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以只有引用传递和指针传递可以用是否加const来重载。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。

【const的理解和用法】相关文章:

C语言关键字const用法09-06

C++ 中const和复合类型08-07

c++ const引用与非const引用09-15

C++中const-cast与reinterpret-cast运算符的用法10-22

C语言中Static和Const关键字的作用09-23

C语言的const使用方法07-02

C语言关键字const的使用09-02

c++中const关键字11-03

英语单词convenient的用法和例句04-15