Я работал над кодом класса "DenseMatrix", целью которого является создание регулярных матриц.
Проходя через код, есть 2 или 3 вещи, которые я не совсем понимаю.
Итак, сначала вот код этого класса:
#include<iostream>
#include<complex>
#include<vector>
#include <cassert>
using namespace std ;
class DenseMatrix{
typedef complex<double> Cplx;
private:
int nr, nc;
vector<Cplx> data;
public :
DenseMatrix(const int& nr0, const int& nc0){
nr = nr0; nc = nc0; data.resize(nr*nc,0);}
DenseMatrix(const DenseMatrix& M){
nr = M.nr; nc = M.nc; data.resize((M.data).size());
for (int j=0; j<data.size(); j++) {data[j]=M.data[j];} }
void operator=(const DenseMatrix& M){
nr = M.nr ; nc = M.nc ; data.resize((M.data).size());
for (int j=0; j<data.size() ; j++){data[j]=M.data[j];} }
Cplx& operator () (const int& j ,const int& k) {
assert(0<=j && j<nr && 0<=k && k<nc) ; return data[k+j*nc];}
const Cplx& operator () (const int& j ,const int& k) const {
assert(0<=j && j<nr && 0<=k && k<nc) ; return data[k+j*nc];}
friend ostream& operator<<(ostream& o , const DenseMatrix& M){
for ( int j =0; j<nr ; j++){ for ( int k=0; k<nc; k++){o << M(j,k) << "\ t " ;} o << endl ;}
//return o ;}
};
Во-первых, какая польза от определения оператора "=", если мы действительно можем использовать конструктор копирования и получить тот же результат?
Во-вторых, если мое понимание верно, Cplx& operator ()
вернет ссылку, и эта ссылка фактически позволит нам изменить приватный атрибут (элемент matix). Но что делает второе определение оператора const Cplx& operator () (const int& j ,const int& k) const
? В чем его полезность?
Спасибо!