欢迎光临散文网 会员登陆 & 注册

[学习笔记]关于operator和&operator,以及const参数的问题

2023-06-11 21:28 作者:哎哟鸽鸽周杰伦  | 我要投稿

区别:
operator返回值是值

&operator返回值是引用(地址),返回引用是为了能够连续赋值

返回引用是为了能够连续赋值 如(a=b)=c,如果不返回引用的话像楼上说的那样,*this是当做临时变内量返回的容,C++为了保证临时变量从产生到返回不被修改,从而把临时变量定义为const,因而(a=b)=c的话,a=b为一个const,c是不能赋值给他的。

例:MyMatrix &operator=(const MyMatrix &b)

今天给舍友debug遇到的这个问题

题目是用运算符重载计算矩阵连续相乘。检查完代码发现,重载完星号*之后返回的内容是没问题的,但是输出的时候有问题,输出了很大的数字(这种一般是越界或没赋值成功)。

错误结果:

正确答案:

3    2

3    2    

经过检查发现,是拷贝的时候出了问题。

这里没有重载=,也没有写拷贝构造函数,导致=发生的是浅拷贝,而类中的矩阵所占的空间是new出来的,这里拷贝仅仅是把地址复制了过去,并没有成功地把内容复制过去。

解决办法是重载=,让参数的data[][]复制给*this的data[][]。

重载=时也遇到了一些问题

最开始重载等号的代码:

MyMatrix operator=(MyMatrix &b)

这样的代码是会报错的,因为写重载*时没有用&operator而是写的operator,由于上面提到的c++的特性,q1*q2得到的返回值会是一个const,所以这里=接收的参数也得是一个const才行。

另外如果不加&也会出现不可预知的错误。

总之,写等号重载的时候记住这种标准写法:

MyMatrix &operator=(const MyMatrix &b)

改正以后成功输出正确答案:

PS:以上内容为个人见解,如有错误欢迎指出

[学习笔记]关于operator和&operator,以及const参数的问题的评论 (共 条)

分享到微博请遵守国家法律