读书人

请问:const成员函数隐式调用

发布时间: 2012-02-21 16:26:23 作者: rapoo

请教:const成员函数,隐式调用
近读侯捷先生译的《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

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

[解决办法]
AddValue是个函数对象
[解决办法]
修改的不是自身成员,而是传入的参数
[解决办法]
elem是个l-value
[解决办法]
想不明白,void operator()(int &elem) const {....}定义为 const 成员函数,那么函数体内不该修改 调用该函数的 对象内的数据成员,这个理解没错吧。

你的理解没错


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


并不能说是隐式调用吧,只能说是用一个临时对象来调用这个operaotr(),而且它并没有修改数据成员theValue ,它是elem += theValue ,theValue 并没有被修改啊,修改的是elem这个参数而已
[解决办法]
想不明白,void operator()(int &elem) const {....}定义为 const 成员函数,那么函数体内不该修改 调用该函数的 对象内的数据成员,这个理解没错吧。
===================================
theValue才是数据成员哦..修改的elem只是一个参数..
[解决办法]
上面都说了,这个函数并没有修改类的数据成员啊....

读书人网 >C++

热点推荐