C语言类型修饰符Const的教程使用说明

描述

  Const也是应该广泛的关键字,表示后面定义有可能是一个不变的常量,但是跟各种数据类型定义组合,能演变出复杂含义。常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

  Const 主要有如下应用情况

  1. 声明后面是一个常量

  2. 如果跟指针组合,将形成复杂的组合情况

  3. 作函数参数数的修饰符。表示不能修改这一参数的值。主要是指针

  4. 作函数返回值, 表示调用函数不能修改这一参数数的值。主要是指针

  Const 让人感到复杂是的,他的位置可以与被修饰的数据类型互换!其它的修饰符没有这样用法。这样换一般情况下是等效的, 如 const int c1= 5; 等效于 int const c1=5;但是,我说是但是,如果数据类型是一个指针,互换一样位置表示完全不同含义,所以const 这 一个用法经常是面试官用来折磨嵌入式C面试者的法宝之一。 参看如下定义 int b = 500; const int* a = &b; [1] int const *a = &b; [2] int* const a = &b; [3] const int* const a = &b; [4] 这种定义要看 const 的位置来确定他的用法。 const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无 关),这种情况下不允许对指针指向内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。

  Const的初始化 Const 在运行时不能修改值,所以只能在定义时进行初始化。 作为参数和返回值的const修饰符 其实,不论是参数还是返回值,道理都是一样的,参数传入时候和函数返回的时候,初始化const变量 1 修饰参数的const,如 void fun0(const A* a );表示a的指向内容不准修改的。 2 修饰返回值的const,如const A * fun2( );表示a指南内容不准备修改。

  Const 的好处是

  •关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

  • 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

  • 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。 Const 一大副作用是,在函数调用时,你必须要把参数调成const 所要求的形式才能被编译调用。有时这样花很大功夫才能做到。

  C++ const用法说明

  C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。

  1.const 修饰成员变量

  #include《iostream》

  using namespace std;

  int main(){

  int a1=3; ///non-const data

  const int a2=a1; ///const data

  int * a3 = &a1; ///non-const data,non-const pointer

  const int * a4 = &a1; ///const data,non-const pointer

  int * const a5 = &a1; ///non-const data,const pointer

  int const * const a6 = &a1; ///const data,const pointer

  const int * const a7 = &a1; ///const data,const pointer

  return 0;

  }

  const修饰指针变量时:

  (1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

  (2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

  (3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

  2.const修饰函数参数

  传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。

  void testModifyConst(const int _x) {

  _x=5;   ///编译出错

  }

  3.const修饰成员函数

  (1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)

  (2)const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

  #include 《iostream》

  using namespace std;

  class Point{

  public :

  Point(int _x):x(_x){}

  void testConstFunction(int _x) const{

  ///错误,在const成员函数中,不能修改任何类成员变量

  x=_x;

  ///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

  modify_x(_x);

  }

  void modify_x(int _x){

  x=_x;

  }

  int x;

  };

  4.const修饰函数返回值

  (1)指针传递

  如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。

  const int * mallocA(){ ///const data,non-const pointer

  int *a=new int(2);

  return a;

  }

  int main()

  {

  const int *a = mallocA();

  ///int *b = mallocA(); ///编译错误

  return 0;

  }

  (2)值传递

  如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。

  所以:

  不要把函数int GetInt(void) 写成const int GetInt(void)。

  不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分