问个基础问题,关于const成员函数

coffee_sugar 2015-02-03 06:30:00
在学习c++的类的时候遇到个不解的问题,无奈身边没人会c++所以来这里请教诸位高手,帮忙给小弟解释解释……
我在看c++ primer的时候:

//头文件
struct Sales_data {
Sales_data() = default;
std::string isbn() const{return bookNo;}
double avg_price() const;
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
std::ostream &print(std::ostream&,const Sales_data&);

//cpp文件

std::ostream &print(std::ostream &os,const Sales_data &item) {
os << item.isbn() <<" " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}

此处不解的是,在print方法的参数列表中item如果是const的话,调用isbn或者avg_price方法时就需要这两个方法必须是const的,但是为何调用数据成员的时候就没有这个要求呢?就是说revenue和units_sold这两个数据成员为何不是const的也没问题?或者说,为什么那个方法需要是const的?
...全文
206 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-02-04
  • 打赏
  • 举报
回复
人必有所不为,然后可以有为。
coffee_sugar 2015-02-04
  • 打赏
  • 举报
回复
引用 8 楼 fly_dragon_fly 的回复:
const 要求对象不改变,即使在调用成员函数也一样,所以要求成员函数有const才行,至于成员变量,它为对象的一部分,在对象为const,它已经是const的,
原来如此……看来还是我看书不仔细,原来成员变量这时候已经是const的了
fly_dragon_fly 2015-02-04
  • 打赏
  • 举报
回复
const 要求对象不改变,即使在调用成员函数也一样,所以要求成员函数有const才行,至于成员变量,它为对象的一部分,在对象为const,它已经是const的,
coffee_sugar 2015-02-04
  • 打赏
  • 举报
回复
我看书上说const成员函数的那个const是声明给隐式this指针的,this指针本身是个常量指针,此处我的print方法中item是个常量引用,如果那个成员函数不是const的话在调用isbn的时候应该是这样的

//伪代码
Sales_data::isbn(&item) {
this=&item;
return this->bookNo;
}
因为此处item是个常量引用,this默认是个顶层const而非底层,所以这里不能直接把item的地址赋给this。而如果isbn是const的话,this就是const Sales_data *const类型的,此时就可以完成isbn的调用。 不知道我理解的对不对
coffee_sugar 2015-02-04
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
赵老师,其实我不是在纠结常量的问题,只是不大明白它这语法……
coffee_sugar 2015-02-04
  • 打赏
  • 举报
回复
引用 1 楼 FightForProgrammer 的回复:
这个和你声明有关吧。你试试是不是因为你函数是const,变量不是const的原因?
我试过了,不是因为函数声明的原因,如果函数声明的不是const的话也会直接出现红色波浪线。除非在形参那就把const去掉,这样才能调用非const函数。我的编译器是LLVM的,跟这个有关么
softee 2015-02-03
  • 打赏
  • 举报
回复
类的实例作为常量参数,数据成员也不能修改,如果被修改,可以比较容易地检查出来。 而方法中若修改了东西,就不好检查,所以就干脆要求方法必须是const的,为节省检查的效率吧。 我个人是这么认为的。
赵4老师 2015-02-03
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
「已注销」 2015-02-03
  • 打赏
  • 举报
回复
print函数没有修改units_sold和revenue的值,所以是没问题的; item是按常量引用进来的,也就是说,它在print函数内被当成一个常量,根据“类的常量实例只能调const方法”,在print中,item的方法中只有带const的可以被调
FightForProgrammer 2015-02-03
  • 打赏
  • 举报
回复
这个和你声明有关吧。你试试是不是因为你函数是const,变量不是const的原因?

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧