错误代码
#include<iostream>
using namespace std;
class Time10
{
public:
Time10(int n1, int n2, int n3) :text1(n1), text2(n2), text3(n3) {}
private:
int text1;
int text2;
const int text3;
};
void main()
{
Time10 t101(0, 0, 0);
Time10 t103(1,1,1);
t103 = t101;//←报错位置
}
vs2017的错误提示
错误分析:
‘=’作为重载运算符,扩展功能为对象之间的相互赋值。系统检测到 t103, t101 均为同一类类对象。便去调用该运算符重载函数,系统定义的这个运算符重载函数没有规避数据成员中的const数据成员 text3 ,而执行了t103.text3=t101.text3;然而const数据成员不能赋值,系统去寻找其他重载函数发现,不存在。出现错误提示。
解决方法:
方法一:(直接)
修改text3的性质,去除const;
方法二:
再定义一个‘=’重载函数;
void Time10::operator=(Time10 &c2)
{
text1 = c2.text1;
text2 = c2.text2;
}
问题总结:
这个错误的发现其实是在一次关于类的使用的总结中发生的,我尝试建立一个类并尽可能多的去覆盖一些类的知识,类中出现了许多特殊类型的数据成员(如:mutable,static,const)。在使用类的赋值方法的时候,便没有注意到数据成员中包括了const类型,出现了错误。
关于问题的处理方法的选择上,因为我个人就是因为粗心犯得,所以我觉得方法一其实更常用。如果出现类似错误,大家可以首选方法一去解决。
但是应该会有类中使用const数据成员更好的情况,或者不方便去除const的情况,这时可以考虑使用方法二。
心情:
第一次在csdn这个平台上发文,其实自己觉得这个错误其实特别低级。我自己在写的时候也在考虑,值不值得公开发表,甚至值不值得花时间写这个文章?一番斗争之后,我觉得值得。原因一是,我不能保证我以后不会再犯这个错误,我写出来可以加深印象。所以值得写。原因二,这个博客写出来主要是为了自己,而发表出去是为了帮助别人,不必在意是否会因为错误低级而被低看。这篇文章我发表出去,有益无害的,虽然帮助很小,但或许能帮助到刚入门c++的朋友。想完这些,释然不少。
写完,感觉小有满足。