请问:const成员函数,隐式调用
请教: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++标准程序库》(华中科技大学出版),第五章讲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只是一个参数..
------解决方案--------------------
上面都说了,这个函数并没有修改类的数据成员啊....