• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
柠檬维C
博客园    首页    新随笔    联系   管理    订阅  订阅

const限定符 浅谈

一、什么是const限定符

  在编写c++程序时,我们有时候希望定义一种变量,他的值不能够被更改,这个时候我们就可以使用const限定符进行限定。

  1、const 初始化

  由于使用const限定符定义的变量的值不允许被修改,所以在创建之初就必须对其进行初始化。

  const int a = init();     //正确

  const int b = 10;       //正确

  const int c = k;         //错误,k不是一个初始化的常量

  我们可以使用const修饰的变量进行与非const变量一样,除了少数能够改变变量内容的大部分操做,比如基本的算数运算,转换为布尔等等。值得一提的是,当我们用const对象去初始化另外一个对象时,对方是不是const 变量都没有关系。当我们拷贝一个值到另外一个对象时,当拷贝完成后,新的对象和原来的对象就没有什么关系了。

  int a = 10;

  const int b = a;

  int c = b;     //b的值拷贝给了c

  编译器在对程序进行编译的过程中,如果遇到了const变量时,会在编译阶段就获取其值,并且将文件中所有该变量都替换成其值,所以为了做到这一点,文件中必须有这个变量  的定义,基于此,在默认情况下const对象的作用域仅在该文件中,所以当你在不同的文件中看到了用const关键字修饰的同名变量时,也不要奇怪。如果我们不希望在每个文件中都定义一个const 的话,解决办法是使用extern关键字去修饰const 变量,不管是声明还是定义。

  extern const int a = fun_init();

  2、const 引用

  我们可以将引用绑定到const对象上去,使用方法与普通变量一样,他们的区别是不允许通过修改引用来修改变量的值。另外,我们也不能使用非常量引用去指向一个常量值。

  const int a = 10;

  const int &r1 =  a;     //正确

   r1 = 12;    //错误,不能够修改r1,也就是a的值

  int &r2 = a;    //错误, 不能使用非常量引用去指向一个常量值

  让我们来看看一种特殊的情况,当一种常量引用被绑定到了另外一种类型会发生什么

  double a =1.234;

  const int &b =  a;

  这里int 型b,作为引用绑定到了double型 a 上,编译时会进行如下操作

  const int temp = a;

  const int &b = temp;

  我们可以看到,编译时计算机会自动生成一个临时变量来完成类型的转换,由此我们可以想到,当b不是一个const变量时,我们就可以对b进行修改,但是修改的是临时变量,而不是a,这不是我们想要的。

  我们必须要认识到的是,我们在定义常量引用时,我们定义的是引用可进行的操作,但是我们引用的那个值可以不是一个常量。

  int a = 1;

  int &b = a;

  const int &c = a;

  b = 2;    //正确

  c = 2;    //错误,c是一个引用常量,不能够通过c改变a 得值;

  3、const 指针

  与引用一样,指针也可以指向常量,但是不允许通过指针去改变常量的值,并且能够存放常量的地址的,只能是使用指向常量的指针。有一点不同的是,指向常量的指针可以指向非常量,但是不能通过指针改变指向对象的值。

  const int a = 10;

  const int * c = &a;     //正确

  int* d = &a;               //错误

  double test = 12;

  const double* ptr = &test;    //正确,但是不可以通过ptr改变test的值,尽管test可以改变

  与引用不同的是,指针本身也是一个对象,所以允许我们将指针本身定义为常量,常量指针必须被初始化。常量指针存储的地址将再也不许被更改,定义方式如下

  const int a = 12;

  int *const ptr = &a;  //ptr将一直指向a

注意:常量指针并不代表不能够修改所指对象内容,这取决于所指内容的对象类型。

posted @ 2021-04-20 17:41  柠檬维C  阅读(84)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3