设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

查看: 890|回复: 2

C++中多才多艺的 const

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:234
  • 打卡月天数:0
  • 打卡总奖励:3470
  • 最近打卡:2025-11-29 17:57:30
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
431
主题
392
精华
0
金钱
4746
积分
901
注册时间
2023-1-13
最后登录
2025-11-29

发表于 2023-2-13 15:59:44 | 显示全部楼层 |阅读模式
1. 定义一个常全局变量
  1. const int global = 100; // 初始化之后不可再赋值
复制代码
这样的
  1. global
复制代码
实际上是一个常量,这是C++用来取代宏定义的其中一种措施,
  1. const
复制代码
常量有类型检测,提高编译器的效率。

2. 定义常指针

这有两个版本,分别是:
  1. const int *p1 = &a; // p1不能修改它所指向的目标
  2. int const *p1 = &a; // p1的另一种等价形式
  3. int *const p2 = &a; // p2本身不可修改
复制代码
上述代码中的p1经常被用作函数参数,用以限制指针的权限,在安全性方面功不可没。p2用的很少,我们很少需要一个本身指向不可变的指针

3. 定义一个STL的常迭代器

这也有类似的两个版本:
  1. vector::const_iterator it1; // it1不能修改它所指代的目标对象

  2. const vector::iterator it2; // it2本身不可修改
复制代码
由于迭代器实际上就是广义指针,因此it1实际上相当于上述代码的p1,it2相当于上述代码的p2,同理it1用的较多,用来限制迭代器的权限。

4. 定义一个类的内部常成员

包括常成员数据和常成员方法:
  1. class text

  2. {

  3.      const int aconst = 100; // 常成员数据,必须初始化

  4.      void func(void) const; // 常成员方法,只能由常对象调用

  5.      static int astatic;

  6. };
复制代码
类的常成员数据
  1. aconst
复制代码
,意味着类对象无法对其修改,这个很容易理解。至于类的常成员方法
  1. func
复制代码
就破费脑力了,语法上的理解是,
  1. func
复制代码
不能修改任何一个类对象的bit,这是显而易见的,这也正是C++标准对
  1. const
复制代码
成员方法的定义。\
来近距离看看func方法的使用:
  1. int text::astatic = 100; // 类外初始化静态数据

  2. void text::func(void) const // 类外定义const成员方法

  3. {

  4. astatic = 200; // 没毛病,astatic不是对象数据,此处可以被修改

  5. aconst = 200; // 错误!const型函数不可修改类对象数据

  6. }
复制代码
定义如上的成员方法很重要,因为它明确地告诉了类的使用者,哪些函数可以修改类对象信息,哪些不会修改类对象信息。
  1. func()
复制代码
这样的函数
  1. const
复制代码
成员方法,只能被常对象调用,以确保不违反权限紧缩原则,比如:
  1. text t1; // 普通对象t1
  2. const text t2; // const型对象t2
  3. t1.func(); // 错误!普通对象不可调用常成员方法
  4. t2.func();
复制代码
注意:函数本体的
  1. const
复制代码
属性是可以被视为重载的依据的,换句话说如果以上类text提供了
  1. non-const
复制代码
版本的
  1. func
复制代码
函数,那么t1将会自动调用
  1. non-const
复制代码
那个版本。
以上陈述似乎平淡乏味,但考虑C++语法规定的这种
  1. bit-wise
复制代码
特性的常成员在处理类成员指针,并且指针指向类外部内存时,情况也许会变得有趣。

5. bit-wise和logical-wise常特性

所谓
  1. bit-wise constness
复制代码
指的是类对象的内部内存意义上只读约束,而
  1. loigcal-wise
复制代码
指的是逻辑意义上的只读约束。编译器没有智能,它只能实现
  1. bit-wise
复制代码
意义上的约束,下面的例子讨论
  1. const
复制代码
成员
  1. operator[ ]
复制代码
的表现可以帮助理解:
  1. class text
  2. {
  3.      ... ...
  4.      char &operator[ ](int pos) const;
  5. private:
  6.      char *p;
  7. };

  8. // const关键字保证了该成员方法只能被 const 对象调用
  9. char &text::operator[ ](int pos) const
  10. {
  11.       return p[pos];
  12. }
复制代码
上述代码中,类text存储真正字符串的地方是指针 p 指向的内存区域,假设此时定义一个
  1. const
复制代码
型的常对象,那么它只能保证类内部信息(也就是p本身)不被修改,却无法保证其所指向的内存区域的安全性。来看下面的代码:
  1. const text ct("abcd");

  2. ct[0] = 'A'; // 一个被编译器允许却跟逻辑相悖的语句
复制代码
此处ct是一个
  1. const
复制代码
型对象,从字面理解出发,我们应该认为ct对象是一个常量,我们应该无法通过任何方式修改其内部信息,但可惜,ct里面的字符串信息实际上并不存在在类内存区域中,于是就出现了可以对一个const型对象进行赋值的有趣现象。
解决以上问题也不难,可以改写 operator[ ] 成员方法的返回值类型:
  1. const char &operator[ ](int pos) const;
复制代码
此时就再也不能对 ct[0] 赋值了,但这只是个个例,关键我们要掌握的内容是:如果我们的类对象拥有成员指针,那么一般意义上的
  1. const
复制代码
成员方法只能保证
  1. bits-wise
复制代码
的常量性(即保证类对象内部的内存信息不被修改),但无法保证所谓的
  1. logical-wise
复制代码
的常量性(即保证逻辑上哪些信息不被修改)。
到此这篇关于C++中的 const的文章就介绍到这了,更多相关C++中的const内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
23
积分
26
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2024-10-3 21:48:48 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
12
积分
4
注册时间
2024-2-6
最后登录
2024-2-6

发表于 昨天 20:19 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表