CONST的重要性,在复制构造函数,等于号重载等函数中*
不想看太多的朋友看这句就行了:在你的复制构造函数作为参数传进去的那个对象前加个const.
是这样的,在写机器学习作业的时候,遇到了很多矩阵算法,为了处理上的方便,我写了一个矩阵类Matrix,如下:
#pragma once
#include
class Matrix {
public:
Matrix();
/*
*释放内存空间
*/
~Matrix();
/*
@array:一个二维数组
@rows_in:array的行数
@cols_in:array的列数
*/
Matrix( int rows_in, int cols_in, const float* array = NULL);
/*
*根据传进来的matirx新建一个Matrix
*/
Matrix(Matrix& matrix);
/*
*设置矩阵某个位置的元素
@row:哪一行
@col:那一列
@value:元素值
*/
void setElement(int row, int col, float value);
/*
*返回矩阵的列数
*/
int getCols()const;
/*
*返回矩阵的行数
*/
int getRows()const;
/*
*求矩阵的行列式
*/
float det();
/*
*求矩阵的逆
*/
//float* inverse();
/*
*重载=号
*/
void operator=(Matrix matrix_in);
/*
*重载*号
*/
Matrix operator*(Matrix& matrix_in);
/*
*重置,释放矩阵空间
*/
void reset();
/*
@打印出矩阵
*/
void printMatrix();
private:
float** elements;
int cols;
int rows;
float detSub(Matrix &matrix)
然后我实现了这里面的函数,没有逻辑错误。
在我测试的时候用了下面的程序:
在这里插入图片描述
正如图片所示,说没有适当的构造函数。我各种改,改了*重载返回结果为Matrix&,我知道这样返回出来的是一个野指针,我只是抱着侥幸的心态去试试,当然是出错了。改到最后,没招了。
开始怀疑人生,不对,是开始怀疑自己是不是对运算符重载有误解啊,然后上了某慕课平台,找了某顶尖高校的c++程序设计课程来看符号重载部分内容。但是这个看只不过验证了我对其理解没有错误。不过也是有收获的,看人家非常严谨,代码有很多const,我也学一下,毕竟这是个不错的习惯嘛,
然后就在一些应该加的地方加了一些const.
改完。我随手运行了一下,看有没有改出毛病来。一运行,哎!,程序竟然正常运行了。真是迷啊,我到底改了啥,他怎么就突然正常了。
当然,作为一个强迫症者,肯定不会就这样过去了,然后我又ctrl+z,回到解放前。一步一步来看,Matrix( Matrix& matrix);改成Matrix(const Matrix& matrix);,就正常了。
分析下原因: 在执行完matrix2=(matrix * matrix1);这句时,matrix * matrix1结束后返回的是一个临时对象,而这里主函数调用复制构造函数Matrix( Matrix& matrix);新建一个对象来保存运算结果,就在新建这个临时对象的时候出问题了,因为*返回出来的对象是const的,而我这里传进复制构造函数的对象不是const的,所以出问题了。