卓航论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 383|回复: 3
打印 上一主题 下一主题

简介C++中的const

[复制链接]
[至尊红钻5级]发帖数量≥8000篇 [未点亮至尊黄钻]威望不足10点 [未点亮至尊蓝钻]在线时间不足10小时 [未点亮至尊绿钻]贡献度不足10点 [至尊紫钻4级]金币≥20000个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 论坛元老
 UID:  7   [未点亮普号显示]钻石不足3个
 阁 分: 36567
 阁 望: 0
 阁 献: 0
 活 跃: 0
 发 贴: 12405 (0)
 阁 币: 24162  
性 别: I'm 火星人!
阅读权限: 90
在线时长: 0 小时
注册时间: 2016-10-16
最后登录: 2016-10-18
go
楼主
发表于 2016-10-17 16:24:25 |只看该作者 |倒序浏览
本帖发表于 2016-10-17 16:24:25...阅读 384 人...加油,亲爱的楼主:[db:作者]
1、const 引用是指向 const 对象的引用:
const int ival = 1024;
const int &refVal = ival; // ok: both reference and object are const
int &ref2 = ival;  // error: non const reference to a const object
可以读取但不能修改 refVal。同理,用 ival 初始化 ref2 也是不合法的。ref2 是普通的非 const 引用,因此可以用来修改 ref2 指向的对象的值。通过 ref2 对 ival 赋值会导致修改 const 对象的值。为阻止这样的修改,需要规定将普通的引用绑定到 const 对象是不合法的。
const 引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:
int i = 42;
// legal for const references only
const int &r = 42;
const int &r2 = r + i;
同样的初始化对于非 const 引用却是不合法的,而且会导致编译时错误。
即:非 const 引用只能绑定到与该引用同类型的对象。而const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。
2、每种容器类型定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。即使用 const_iterator 类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。
例如,如果text是vector 类型,程序员想要遍历它,输出每个元素,可以这样编写程序:
// use const_iterator because we won't change the elements
for (vector::const_iterator iter = text.begin();iter != text.end(); ++iter)
cout
除了是从迭代器读取元素值而不是对它进行赋值之外,这个循环与普通循环相似。由于这里只需要借助迭代器进行读,不需要写,这里把iter 定义为const_iterator 类型。当对const_iterator 类型解引用时,返回的是一个const 值。不允许用const_iterator进行赋值
for (vector::const_iterator iter = text.begin();iter != text.end(); ++ iter)
*iter = " ";   // error: *iter is const
总而言之:使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。
3、不要把const_iterator对象与const的iterator对象混淆起来。声明一个const迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值:
vector[i] nums(10); // nums is nonconst
const vector[i]::iterator cit = nums.begin();
*cit = 1;        // ok: cit can change its underlying element
++cit;         // error: can't change the value of cit
即:// an iterator that cannot write elements
vector[i]::const_iterator
// an iterator whose value cannot change
const vector[i]::iterator
               
4、指向 const 对象的指针
如果指针指向const对象,则不允许用指针来改变其所指的const值。为了保证这个特性C++语言强制要求指向const对象的指针也必须具有const特性:
const double *cptr; // cptr may point to a double that is const
这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身。也就是说,cptr本身并不是const。在定义时不需要对它进行初始化,如果需要的话,允许给 cptr重新赋值,使其指向另一个const对象。但不能通过cptr修改其所指对象的值:
*cptr = 42;  // error: *cptr might be const
把一个 const 对象的地址赋给一个普通的、非 const 对象的指针也会导致编译时的错误:
const double pi = 3.14;
double *ptr = π    // error: ptr is a plain pointer
const double *cptr = π // ok: cptr is a pointer to const
允许把非 const 对象的地址赋给指向 const 对象的指针,例如:
double dval = 3.14; // dval is a double; its value can be changed
cptr = &dval;    // ok: but can't change dval through cptr
尽管dval不是const对象,但任何企图通过指针cptr修改其值的行为都会导致编译时的错误。cptr一经定义,就不允许修改其所指对象的值。如果该指针恰好指向非const对象时,同样必须遵循这个规则。
在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
5、const 指针
除指向 const 对象的指针外,C++ 语言还提供了 const 指针——本身的值不能修改:
int errNumb = 0;
int *const curErr = &errNumb; // curErr is a constant pointer
我们可以从右向左把上述定义语句读作“curErr 是指向 int 型对象的 const 指针”。与其他 const 量一样,const 指针的值不能修改,这就意味着不能使 curErr 指向其他对象。任何企图给 const 指针赋值的行为(即使给 curErr 赋回同样的值)都会导致编译时的错误:
curErr = curErr; // error: curErr is const
与任何 const 量一样,const 指针也必须在定义时初始化。
指针本身是 const 的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。例如,curErr 指向一个普通的非常量 int 型对象 errNumb,则可使用 curErr 修改该对象的值:
if (*curErr) {
errorHandler();
*curErr = 0; // ok: reset value of the object to which curErr is bound
}
6、指向 const 对象的 const 指针
还可以如下定义指向 const 对象的 const 指针:
const double pi = 3.14159;
// pi_ptr is const and points to a const object
const double *const pi_ptr = π
本例中,既不能修改 pi_ptr 所指向对象的值,也不允许修改该指针的指向(即 pi_ptr 中存放的地址值)。可从右向左阅读上述声明语句:“pi_ptr 首先是一个 const 指针,指向 double 类型的 const 对象”。
分享到: QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0 支持支持0 反对反对0

使用道具 举报

[至尊红钻3级]发帖数量≥1000篇 [至尊黄钻3级]威望≥500点 [至尊蓝钻1级]在线时间≥10小时 [至尊绿钻9级]贡献度≥80000点 [至尊紫钻9级]金币≥8000000个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 管理员
 UID:  1   [未点亮普号显示]钻石不足3个
 阁 分: 2147483647
 阁 望: 993
 阁 献: 2147483647
 活 跃: 0
 发 贴: 1532 (0)
 阁 币: 9430326  
性 别: I'm 火星人!
阅读权限: 200
在线时长: 46 小时
注册时间: 2016-10-14
最后登录: 2023-10-3
沙发
发表于 2016-10-18 11:04:42 |只看该作者
本回复帖发表于 2016-10-18 11:04:42,感谢爱情孤儿对本帖的认真回复,你的回复是对楼主莫大的鼓舞
不错不错,楼主您辛苦了。。。

使用道具 举报

[至尊红钻2级]发帖数量≥100篇 [未点亮至尊黄钻]威望不足10点 [未点亮至尊蓝钻]在线时间不足10小时 [未点亮至尊绿钻]贡献度不足10点 [未点亮至尊紫钻]金币不足100个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 注册会员
 UID:  29   [未点亮普号显示]钻石不足3个
 阁 分: 111
 阁 望: 1
 阁 献: 4
 活 跃: 0
 发 贴: 104 (0)
 阁 币: 1  
性 别: I'm 火星人!
阅读权限: 20
在线时长: 2 小时
注册时间: 2011-1-6
最后登录: 2016-10-20
板凳
发表于 2016-10-19 20:19:11 |只看该作者
本回复帖发表于 2016-10-19 20:19:11,感谢za402对本帖的认真回复,你的回复是对楼主莫大的鼓舞
不知该说些什么。。。。。。就是谢谢

使用道具 举报

[至尊红钻2级]发帖数量≥100篇 [至尊黄钻1级]威望≥10点 [未点亮至尊蓝钻]在线时间不足10小时 [未点亮至尊绿钻]贡献度不足10点 [未点亮至尊紫钻]金币不足100个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 注册会员
 UID:  30   [未点亮普号显示]钻石不足3个
 阁 分: 175
 阁 望: 10
 阁 献: 6
 活 跃: 0
 发 贴: 140 (0)
 阁 币: 9  
性 别: I'm 火星人!
阅读权限: 20
在线时长: 2 小时
注册时间: 2011-1-6
最后登录: 2016-10-21
地板
发表于 2016-10-21 22:41:57 |只看该作者
本回复帖发表于 2016-10-21 22:41:57,感谢abooooooo对本帖的认真回复,你的回复是对楼主莫大的鼓舞
路过,学习下

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、每个贴内连续回复请勿多余3贴,每个版面回复请勿多余10贴!
4、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!

手机版| 百度搜索:vkee.pw

2012-2015 卓航旗下 GMT+8, 2024-5-18 19:14 , Processed in 0.547309 second(s), 30 queries . Powered by Discuz! X3.2  

禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.如遇版权问题,请及时联系站长(QQ:5213513)

今天是: | 本站已经安全运行: //这个地方可以改颜色

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