请选择 进入手机版 | 继续访问电脑版

[C 语言] C++ const限定符以及顶层const和底层const的案例详解

[复制链接]
查看53 | 回复4 | 2021-9-14 08:06:24 | 显示全部楼层 |阅读模式
目次

一、const限定符的作用

  当我们在写程序的时间 ,想定义一种变量,它的值不会被改变,这时就可以用const限定符来定义变量,也可称它为常量,常量的定义必须要有初始值,否则编译错误。着实 际例子是用一个变量来表示缓冲区的大小的时间 。

  对内置范例 用const是比较平常 易懂的,其作用就是不能对用const定义了的变量举行 修改(写),但可以举行 拷贝(读)。

  1. const int bufSize = 512; //正确
  2. const int bufSize2; //错误,const对象必须要初始化
  3. int buffer[bufSize];
  4. const int a = 1;
  5. int b = 2;
  6. a = 3; //错误,不能对常量进行赋值
  7. b = a; //正确
复制代码

二、const和引用

  在我的明白 中,引用就相称 于一个常量,它在初始化时就已经与一个对象绑定在一起,之后就不能绑定其他对象,这种埋头 的品格 非常值得我们学习。而当用const对引用举行 定义时,它的作用就是阐明 该引用绑定的对象是一个常量,不能对该引用举行 修改(毕竟 上,常量引用绑定的对象不肯定 是常量,常量引用中的“常量”这两个字的意思着实 是引用以为 其绑定的对象是一个常量,但该绑定的对象是变量也是合法的,下面通过代码具体 阐明 )。

  1. //非常量引用
  2. int a = 0;
  3. int &r = a;
  4. r = 1; //通过操作引用来对a赋值,此时相当于a=1
  5. //常量引用绑定常量
  6. const int b = 1; //b是一个常量
  7. const int &r2 = b; //正确
  8. r2 = 5; //错误,不能对常量引用进行修改
  9. b = 5; //错误
  10. //常量引用绑定变量
  11. int c = 1;
  12. const int &r3 = c; //正确,常量引用也可以绑定变量
  13. r3 = 5; //错误,不可修改常量引用
  14. int d = r3; //正确,常量引用可读,该值为c
  15. c = 5; //正确,可修改变量
  16. //非常量引用不可绑定常量
  17. const int e = 1;
  18. int &r4 = e; //错误
复制代码

  以上四种环境 已阐明 const和引用的关系,为何第四种环境 中不可用非常量引用绑定常量呢,这是由于 我们已经定义了e是一个不可修改的常量,假如我们用非常量引用成功绑定了它,并且可以通过修改引用来使e的值改变,这不就违反 了e作为常量其值不可改变的理念了吗,以是 第四种环境 编译器是会报错的。

  常量引用中的const的作用是针对引用绑定的对象的,指所绑定的对象是一个常量,这叫做底层const。

三、const和指针

  引用不是一个对象,因此const不能针对引用起作用,只能对引用的绑定对象起作用。但指针是一个对象,以是 指针和const之间有三种组合方式:1.常量指针,2.指向常量的指针,3.指向常量的常量指针,其三者作用如下代码所示。

  1. //1、常量指针
  2. //常量指针指向变量,即常量指针中的地址不能修改
  3. int a = 1;
  4. int b = 2;
  5. int *const p = &a; //正确,常量指针可以指向变量
  6. p = &b; //错误,常量指针中的地址值不能修改
  7. *p = 2; //正确,p的解引用是a的值,a是变量,可以修改该值
  8. //2、指向常量的指针
  9. //即指针中的地址可以修改,但指向的对象是常量不能用解引用修改值(实际上指向的对象可以是变量)
  10. int c = 3;
  11. const int d = 4;
  12. int e = 5;
  13. const int f = 6;
  14. int const *p2 = &c; //正确,指向常量的指针可以指向变量
  15. const int *p3 = &d; //正确,指向常量的指针指向常量
  16. p2 = &e; //正确,可以改变指向的地址
  17. p3 = &f; //正确
  18. *p2 = 0; //错误,虽然p2实际指向的是一个变量,但操作p2的解引用时p2把指向的对象看作常量,因此不能通过解引用来修改对象的值
  19. c = 0; //正确,不能通过p2的解引用修改c,但c自身是变量可以修改
  20. *p3 = 0; //错误,同理p2
  21. f = 0; //错误
  22. //3、指向常量的常量指针
  23. //即指针中的地址不可以修改,指向的对象是常量也不能用解引用修改值(实际上指向的对象可以是变量)
  24. int g = 1;
  25. const int h = 2;
  26. const int *const p4 = &g; //正确
  27. const int *const p5 = &h; //正确
  28. p4 = &h; //错误,不能修改值
  29. *p4 = 0; //错误,不能修改其解引用
复制代码

  对象的范例 确定了对象的操作,因此指向常量的指针它的“常量”两字不是限定 指针指向的对象必须是常量,而是限定 了指针的解引用操作。由于 指向常量的指针和常量引用一样,是一个自以为是的家伙,它以为 本身 指向的肯定 是一个常量,以是 对指向常量的指针举行 解引用,让指针以为 在对一个常量举行 修改,因此这黑白 法的举动 。

四、顶层const和底层const

1、顶层const

  何为顶层const,其定义为对象本身是一个常量,因此对统统 的内置范例 常量而言,全部 的const都是顶层const,而对于指针而言,常量指针是顶层const,对于引用则没有顶层const的概念,以下代码都是顶层const。

  1. const int a = 1;
  2. const double val = 3.14;
  3. const string str = “hello”;
  4. int *const p = &a;
复制代码

  顶层const的对象一旦完成初始化,就不能修改其值,但可以作为被拷贝对象举行 拷贝操作,如下代码所示。

  1. const int b = 1;
  2. b = 2; //错误,顶层const不能修改值
  3. int c = b; //正确,顶层const可以被拷贝
  4. int *const p2 = &b;
  5. *p2 = 0; //错误,实际指向的为常量,不能修改其解引用
  6. p2 = &c; //错误,顶层const不能修改值
  7. int *const p3 = &c;
  8. *p3 = 3; //正确,实际指向的为变量,可以修改其解引用
  9. const int *p4 = p2; //正确,顶层const可以被拷贝
  10. *p4 = 0; //错误,p4是底层const(下面解释),不能修改其解引用
复制代码

  有些朋侪 大概 对const int *p3这句定义语句有疑问,着实 它和int const *p3是一样的,都是指向常量的指针,也是一个底层const(下面先容 ),而以上代码阐明 顶层const对象不能修改,但可以被拷贝,由于 被拷贝的过程中,是可以忽略顶层const的。

2、底层const

  底层const这个概念只在指针和引用上有用 ,其定义是该指针指向或该引用绑定的对象是常量。因此指针可以有顶层const和底层const,而引用只有底层const。

  1. int a = 0;
  2. int const *p = &a; //底层const
  3. const int &r = a; //底层const
复制代码

  很多朋侪 大概 分不清一个指针到底是底层const还是顶层const,这里可以教大家一个方法,就是看变量名近来 的声明符是什么,比方 const int *p,近来 的声明符是*,因此他是一个指针,第二个声明符才是const,因此他是一个指向常量的指针;又比方 int *const p2,近来 的声明符是const,因此p2是一个常量,第二个声明符才是*,因此它是一个常量指针。着实 大家只要记住一个就行,各人有各人的方法,最告急 本身 以为 好用啦。

  相识 了底层const,那么我们分析一下底层const可以举行 哪些操作,以下为代码。

  1. int a = 0;
  2. const int b = 0;
  3. int const *p = &a; //底层const可以指向常量也可以指向变量,因为对于&a该类型可以从int*转换为const int*,因此可以说成对象被拷贝时可以忽略其顶层const
  4. //对于引用的底层const,即是常量引用
  5. const int &r = a; //绑定一个变量
  6. r = 0; //错误,引用的底层const不可以修改值。
  7. int c = r; //正确
  8. const int d = r; //正确
  9. int &r2 = r; //错误
  10. const int r3 = r; //正确
  11. //对于指针的底层const,即指向常量的指针
  12. //修改指针的值
  13. p = &b; //正确,指针的底层const可以修改值
  14. *p = 2; //错误,指针的底层const不可以修改解引用的值
  15. //指针被拷贝
  16. int *p2 = p; //错误
  17. int *const p3 = p; //错误
  18. int const *p4 = p; //正确
  19. const int *const p5 = p; //正确,p5有顶层和底层const
复制代码

  对于引用的底层const,由于 引用没有顶层const,对于它的操作特性,可以从它绑定了一个常量这个基础去明白 ,现实 它不肯定 绑定常量,但在利用 常量引用时要当作 他始终绑定了一个常量,那么它的修改和被拷贝是否答应 就比较清晰 了。

  对于指针的底层const,指针把本身 指向的对象视为常量,以是 我们修改解引用的值时相称 于修改指向的谁人 常量对象的值,这是不答应 的,以是 编译器报错。但指针不是常量指针(没有顶层const),因此可以修改指针的值(指向的对象可以改变)。当有底层const的指针用作被拷贝的对象是,其底层const就不能忽略了,拷入和拷出的对象必须都要有底层const才能对底层const指针举行 拷贝操作。

对指针const限定符的总结:

  1. 顶层const不能修改值,但其解引用大概 可以修改(根据现实 指向的对象决定)
  2. 顶层const作为被拷贝值时,没有限定 ,可以被忽略
  3. 底层const可以修改值,但其解引用不能修改
  4. 底层const在用作拷贝操作时,要求拷入与拷出值都有雷同 的底层const(都是底层const,或都不是),不能忽略。

到此这篇关于C++ const限定符以及顶层const和底层const的案例详解的文章就先容 到这了,更多干系 C++ const限定符以及顶层const和底层const内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 绘粹凭 | 2021-9-23 21:42:01 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 半老徐爷椒 | 2021-9-23 21:42:04 | 显示全部楼层
今天皮痒了?
回复

使用道具 举报

avatar 六翼天使494 | 2021-10-4 10:07:09 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则