【c++】=過載,報錯:沒有合適的複製建構函式
阿新 • • 發佈:2018-12-20
- 不想看太多的朋友看這句就行了:在你的複製建構函式作為引數傳進去的那個物件前加個const.
- 是這樣的,在寫機器學習作業的時候,遇到了很多矩陣演算法,為了處理上的方便,我寫了一個矩陣類Matrix,如下:
#pragma once #include <iostream> 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的,所以出問題了。 - 文章僅代表個人見解,若有錯誤,歡迎各位朋友批評指正!