类对象之间的赋值 的错误使用

错误代码

#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++的朋友。想完这些,释然不少。

写完,感觉小有满足。

扫描二维码关注公众号,回复: 1662243 查看本文章



猜你喜欢

转载自blog.csdn.net/weixin_41525190/article/details/79859218