免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1632 | 回复: 3
打印 上一主题 下一主题

[函数] 请教:const成员函数,隐式调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-08 11:54 |只看该作者 |倒序浏览
近读侯捷先生译的《C++标准程序库》(华中科技大学出版),第五章讲function objects的地方,有点不理解,代码如下(可正常编译执行):

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

class AddValue
{
      private:
              int theValue;
      public:
             AddValue(int v):theValue(v){}
             void operator()(int &elem) const{ elem += theValue; } //这个地方的const
};

int main()
{
      list<int> coll;

      for (int i=1;i<=9;++i)
              coll.push_back(i);
      for_each (coll.begin(),coll.end(),AddValue(10))   //这个地方怎么调用的
              ;
      list<int>::const_iterator pos;
      for (pos=coll.begin();pos!=coll.end();++pos)
          cout << *pos << ' ';
}


想不明白,void operator()(int &elem) const {....}定义为 const 成员函数,那么函数体内不该修改 调用该函数的 对象内的数据成员,这个理解没错吧。

for_each (coll.begin(),coll.end(),AddValue(10))  中的 AddValue(10)可是个隐式调用?其调用对象是 coll 中的 一个 int 数据成员,按说 const 函数是不该修改 coll中的数据成员的,这里怎么可以修改呢:elem += theValue

请达人帮忙解释一下,谢谢

论坛徽章:
0
2 [报告]
发表于 2007-04-08 12:26 |只看该作者
for_each (coll.begin(),coll.end(),AddValue(10));

AddValue(10)构造了一个AddValue对象(函数对象),
之后,for_each()把coll中的每个元素传递给函数对象,
由它的void operator()(int &elem) const作处理。

函数对象的状态没有改变,而coll中的每个元素都加10。

论坛徽章:
0
3 [报告]
发表于 2007-04-08 12:56 |只看该作者
void operator()(int &elem) const{ elem += theValue; } //这个地方的const

楼主理解错了吧,这里没有修改类的数据成员啊!只是修改了实参的值而已
可以看看以前的帖子
http://www.chinaunix.net/jh/23/300602.html

论坛徽章:
0
4 [报告]
发表于 2007-04-08 18:48 |只看该作者
受教,多谢!
多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP