回 帖 发 新 帖 刷新版面

主题:C++中关于运算符重载的一个小问题

#include<iostream.h>
class Matrix
{
    friend  bool Multiply(Matrix &m1, Matrix &m2, Matrix &m3);
public:
    Matrix(int row, int col);
    ~Matrix() {delete[] mem;}

    void Print();
    int GetRows() const {return rows;}
    int GetCols() const {return cols;}
    int & operator () (int i, int j);        //"()"运算符的重载
    bool operator = (Matrix &src);            //赋值运算符"="的重
    //Matrix operator = (Matrix &src);    
    Matrix operator * (Matrix &);        //矩阵相乘  
private:
    int rows, cols;
    int *mem;
};

Matrix::Matrix(int row, int col):rows(row), cols(col)
{
    mem = new int[row * col];
}


int & Matrix::operator () (int i, int j)
{
    return mem[i*cols + j];
}

bool Matrix::operator = (Matrix &src)
{
    if (rows != src.rows || cols != src.cols)
    {
        return false;
    }
    for (int i = 0; i < rows * cols; i++)
    {
        mem[i] = src.mem[i];
    }
    return true;
}

Matrix Matrix::operator * (Matrix &m)
{
    Matrix m3(rows, m.cols);        //临时矩阵
    int sum;
    int i, j, k;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < m.cols; j++)
        {
            sum = 0;
            for (k = 0; k < cols; k++)
            {
                sum += (*this)(i,k) * m(k,j);
            }
            m3(i,j) = sum;
        }
    }
    return m3;
}

void Matrix::Print()
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            cout << mem[i*cols + j] << " ";
        }
        cout << endl;
    }
    cout << endl;
}

int main(int argc, char * argv)
{
    Matrix m1(3,4), m2(4,3), m3(3, 3), m4(3, 3);
    int i, j;
    //设置m1内容
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            m1(i,j) = i + j;
        }
    }
    //设置m2内容
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 3; j++)
        {
            m2(i, j) = i + j;
        }
    }

    //m1 x m2 = m3
    m3 = (m1*m2);//有什么问题,这一句????
    m4 = m3;

    m1.Print();
    m2.Print();
    m3.Print();
    m4.Print();
    return 0;
}

回复列表 (共2个回复)

沙发

多注意const的使用。

楼主的定义:
bool operator = (Matrix &src);            //赋值运算符"="的重
是有问题的。一般来说,如果把src的值赋给*this,则src本身的值不会被修改。所以应该写“const Matrix &src”,而不是“Matrix &src”。顺带一提,operator =的返回值类型一般是Matrix&,而不是bool。

然后来看,m3 = (m1*m2);这一句。m1*m2可以调用operator*,进行运算后得到的是一个Matrix类型的值。注意得到的这个值是临时的,根据C++语法,临时对象无法取得它的非const引用,只能取得const引用。而赋值时因为楼主声明需要一个非const引用,所以出错。

一些编译器可能会允许取得临时对象的非const引用,比如Visual C++。我用Visual C++ 2008编译,除了<iostream.h>那里之外,没有遇到任何编译错误。但注意这是非标准的,最好还是按照标准的语法来写。

板凳

参考定义:

// operator(),取矩阵中的元素,这个需要两份。一份是const的,一份是非const的。满足不同需要
int & operator () (int i, int j);        //"()"运算符的重载
int operator () (int i, int j) const;        //"()"运算符的重载

// operator =,赋值。注意返回类型一般应该是Matrix&,返回值一般应该是*this
// 这样才可以写成连续赋值的形式:m1 = m2 = m3 = m4 * m5;
Matrix& operator =(const Matrix& src);

// operator *,乘法。注意乘法不会修改*this本身,所以可以定义为const
// 另外,返回一个对象时,一般应该加上const,这样可以租住m1 * m2 = m3这样奇怪的代码通过编译
const Matrix operator *(const Matrix& m) const;


程序应该还有一些其它问题。运行时崩溃了。楼主加油。

我来回复

您尚未登录,请登录后再回复。点此登录或注册