前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++:18---const关键字(附常量指针、指针常量、常量指针常量)

C++:18---const关键字(附常量指针、指针常量、常量指针常量)

作者头像
用户3479834
发布2021-02-03 15:43:26
1.3K0
发布2021-02-03 15:43:26
举报
文章被收录于专栏:游戏开发司机游戏开发司机

一、const变量的一些基本特点

  • ①const修饰的变量不能被修改
代码语言:javascript
复制
const int a=10;a=20;//错误
  • ②因为const修饰的变量不能被修改,所以必须被初始化
代码语言:javascript
复制
int a=10;const int b=a;  //正确const int c=10; //正确
  • ③const修饰的变量可以赋值给其他值
代码语言:javascript
复制
const int a=10;int b=a;//正确
  • ④可以有常量引用
代码语言:javascript
复制
int a=10;const int &b=a;

二、在其他文件中使用const常量(extern)

  • const常量默认只能在当前文件使用,可以使用extern使const常量在文件中共享
  • 注意:在别的文件中使用const常量时,如果出现同名时:①其他文件的局部变量会覆盖const常量。②其他文件的全局变量会报错,显示重定义

方法:

  • 在demo.h文件中extern const int a;//声明
  • 在demo.c文件中extern const int a=1;(extern可省略)

三、const和引用

  • 把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“对常量的引用”
  • 与普通的引用不同的是,对常量的引用不能被用作修饰它所绑定的对象:
代码语言:javascript
复制
const int ci = 1024;
const int &r1 = ci; //正确,引用到常量上r1 = 42;            //错误,不能对常量的引用进行修改int &r2 = ci;       //错误,不能让一个非常量引用指向一个常量对象//因为引用可以通过改变自身值而改变所引用的值,所以为了防止引用改变值,禁止使用普通引用引向const常量

初始化和对const的引用

  • 在引用的文章中介绍,引用的类型必须与其引用的对象类型一致,但是有两个例外:
    • ①在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转成引用的类型即可(见下面代码段1)
    • ②允许为一个常量引用绑定非常量的对象、字面值、甚至是个一般表达式(见下面代码段2)
代码语言:javascript
复制
//代码段1double dval = 3.14;const int &ri = dval;//正确
/*上面的代码会生成一个int类型的临时变量,然后将临时变量赋值给ri,因此上述代码可以扩展为:    double dval = 3.14;    const int temp = dval; //临时变量    const int &ri = temp ;*/
代码语言:javascript
复制
//代码段2int i = 42;const int &r1 = i;     //正确,允许将const int&绑定到一个普通对象上const int &r2 = 42;    //正确const int &r3 = r1 * 2;//正确int &r4 = r1 * 2;      //错误

四、常量和指针

  • 也可以用const来修饰指针,指向常量的指针不能用于改变其所指对象的值
  • 常量只能由常量指针来指向,不能由非常量指针来指向
代码语言:javascript
复制
const double pi = 3.14;
double *ptr = π       //错误。ptr是非常量的const double *cptr = π//正确
  • 可以使用常量指针指向一个非常量对象:
代码语言:javascript
复制
double dval = 3.14;const double *cptr = &dval; //正确
  • 不能通过常量指针改变所指对象的值:
代码语言:javascript
复制
const double dval = 3.14;const double *cptr = &dval; //正确*cptr = 6.28;  //错误
double dval2 = 3.14;const double *cptr2 = &dval; //正确*cptr2 = 6.28;  //错误

五、常量指针、指针常量、常量指针常量

  • 常量指针:(指向常量的指针)。指向可以改,但是不能通过该指针改变所指向的值
    • 这种类型的const也被称为“底层const”:表示指针所指向的值是个常量
  • 指针常量:(指针的常量)。指向不可以改,但可以通过该指针改变所指向的值
    • 这种类型的const也被称为“顶层const”:表示指针本身是个常量
  • 常量指针常量:不可以修改指向,也不可以修改所指向的值
代码语言:javascript
复制
const int* pa;       //常量指针int const* pb;       //常量指针
int * const pc;      //指针常量
int const* const pd;//常量指针常量

如果通过const的位置来判断const对什么起作用:

  • const对左边的类型起作用,当const左边没有东西时,才对右边的起作用,因此有以下规则:
    • 常量指针时,const左边为int或const左边无内容右边有int,因此只对int(值)生效,所以为常量指针
    • 指针常量时,const左边为*(代表指针),所以为指针常量
    • 常量指针常量时,有两个const,对int(值),*(指针)都生效,因此为常量指针常量
  • 当然,上面的规则可以简化为下面一句话:
    • const出现在“*”号的左边,代表所指之物是常量
    • const出现在“*”号的右边,代表指针自身是个常量

初始化与使用

  • 常量指针,因为所指对象是个常量,所以有下面的规则
    • 可以常量指针指向于常量或非常量
    • 但是不能修改值
代码语言:javascript
复制
int a = 1;const int b = 2;
const int *pa = &a; //正确,可以指向非常量pa = &b;            //正确,指向可以改变
*pa = 1;            //不能通过常量指针修改所指对象的值
  • 指针常量,因为指针是个常量,而不是类型是常量,因此有下面的规则:
    • 只能指向于非常量,不能指向于常量(因为放置指针常量修改常量的值)
    • 不可以改变指针常量的指向,因为指针自身是个常量
代码语言:javascript
复制
int a = 1;const int b = 2;int c = 3;
int* const pa = &a; //正确,a是非常量int* const pb = &b; //错误,b是常量
*pa = 10; //正确,可以修改指向对象的值pa = &c;  //错误,不能修改pa的指向(因为指针自身是个常量)
  • 常量指针常量,有如下规则:
    • 可以使用常量、非常量赋初值
    • 不能改变值、不能改变指向
代码语言:javascript
复制
int a = 1;const int b = 2;
const int *const p1 = &a; //正确const int *const p2 = &b; //正确
*p1 = 2; //错误p1 = &b; //错误

之间的转换

  • 转换的规则是:非常量可以转换为常量,反之不行
代码语言:javascript
复制
int i = 0;int j = 0;const int ci = 42;
const int *p2 = &ci;int *const p1 = &j;const int *const p3 = p2;p3 = p1;      //错误,p3的指向也不能更改
int *p = p3;  //错误,p3包含const,而p没有p2 = p3;      //正确,p2和p3都包含底层constp1 = p3;      //错误,p1的指向不能更改
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、const变量的一些基本特点
  • 二、在其他文件中使用const常量(extern)
  • 三、const和引用
    • 初始化和对const的引用
    • 四、常量和指针
    • 五、常量指针、指针常量、常量指针常量
      • 初始化与使用
        • 之间的转换
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档