大佬教程收集整理的这篇文章主要介绍了Exercise_7_27的学习,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
最近在看《C++ primer》,做到了练习7.27的时候,遇到了一些问题,在此记录。
如"#1"和"#2"处的两段对do_display()的定义,在类内声明并定义private成员函数是可以的,同样在类内声明,随后在类外定义也是可以的。
在"#3"处的代码,可以看到形参列表中有一个Std::ostream &os,这里是指将输出流的引用传入了函数。但是第一次写程序的时候忘记加这个&了,而是变成了输出流的拷贝来使用,出现了如下的错误:
use of deleted function 'std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits>&)
在"#4"处的大括号结尾处,如果程序没有在此结束,则strut/class{}的后面需要加分号";",不然会报错,如下:
expected initializer before '&' token
但是回头审查代码,这个分号是在第32行没有加的,却提醒我35行的Screen &Screen::move(…)的引用符号出现了问题,真是费解。
可以看到在"#5"和"#6"的地方定义了两次display()这个函数,主要的区别是对返回的类型的限定不同,都是返回函数指针的函数,但是第一个是返回的非常量类型的(*this),第二个却是常量类型的。
具体的调用重载区别可以看.cpp文件内的"#7"部分,当在vscode 的IDE下进行编写的时候,对于非常量的Screen对象pm1,当你敲下"."的时候,所有在public中定义的成员都是可见的;但是常量的对象pm2只能看到重载的const Screen &Screen::display() const{…}。
需要特别注意的是,平时虽然后面的const并不影响返回对象的常量属性,只是影响成员函数对成员的可操作性。但是当返回的对象类型是函数类型的时候,如果后面加了const限定符,则调用该成员函数的时候,this指针指向的对象就是常量。
举个例子,Screen &Screen::display() {…}和const Screen &Screen::display() const{…}中都调用了inline void Screen::do_display(ostream &os) const {…},但是不论是第一个display()还是第二个,当调用do_display() const {…}的时候,this指针指向的对象都被隐式地转化为了常量对象,当引用结束后返回的this仍然是调用之前的this类型。
所以可以推导出如果只有前面的const,那么在调用第二个display()函数的时候,返回的this指针是非常量的,这和声明的返回类型不符。但是只有后面的const的时候,两个display()函数从形参到返回类型都是一样的,就出现了重载的二义性问题,编译同样无法通过。
2021.4.18 13:31
于宁波大学园区图书馆二楼窗边
以上是大佬教程为你收集整理的Exercise_7_27的学习全部内容,希望文章能够帮你解决Exercise_7_27的学习所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。