模板类c++的赋值操作符

Assignment operator of template class c++

本文关键字:赋值操作符 c++      更新时间:2023-10-16

永远不调用赋值操作符重载。

在主文件中1。,复制构造函数在2中调用和。,首先调用operator +,然后调用operator *,最后调用默认赋值操作符。

这个问题有什么原因吗?

template<int r, int c, class F = int>
class Matrix {
public:
    Matrix(){
        int i, j;
        data = new F[(r*c)];
        for (i = 0; i < c; i++){
            for (j = 0; j < r; j++){
                data[j + (i*c)] = 0;
            }
        }
    }
    ...
    Matrix(const Matrix& a){
        int i=r, j=c;
        data = new F[(r*c)];
        for(i = 0; i < r; i++){
            for(j = 0; j < c; j++){
                data[j+(i*c)] = a.data[j+(i*c)];
            }
        }
    }
    **Matrix operator=(const Matrix a){
        int i, j;
        if (data != NULL){
            delete data;
            data = NULL;
        }
        data = new F[(r*c)];
        for(i = 0; i < r; i++){
            for(j = 0; j < c; j++){
                data[j+(i*c)] = a.data[j+(i*c)];
            }
        }
        return *this;
    }**
    friend Matrix operator+( Matrix<r, c, F>& a, int b){
        Matrix<r, c, F> temp;
        int i, j;
        for(i = 0; i < r; i++){
            for(j = 0; j < c; j++){
                temp.data[j+(i*c)] = a.data[j+(i*c)] + b;
            }
        }
        return temp;
    }
    Matrix operator*(const int a){
        Matrix <r, c, F> temp(*this);
        int i, j;
        for(i = 0; i < r; i++){
            for(j = 0; j < c; j++){
                temp.data[j+(i*c)] *= a;
            }
        }
        return temp;
    }
   ...

    ~Matrix(){
        delete[] data;
        data = NULL;
    }
private:
    F *data;

};

int main( ) {
    ...
    Matrix<4, 4> identity(1);
    std::cout << identity << std::endl;
    1.**Matrix<4, 4> res = identity;**
    Matrix<4, 4> identity_2(1);
    std::cout << identity _2<< std::endl;
    2.**Matrix<4, 4> res_2 = (identity_2 + 2) * 3;**
...
friend Matrix operator+( Matrix<r, c, F>& a, int b){
    Matrix<r, c, F> temp;
    int i, j;
    for(i = 0; i < r; i++){
        for(j = 0; j < c; j++){
            temp.data[j+(i*c)] = a.data[j+(i*c)] + b;
        }
    }
    return temp;
}

这段代码混淆了操作符的非成员和成员语法。

friend Matrix operator+( Matrix<r, c, F>& a, int b);

表示"有一个非成员函数可以访问我的内部文件"。但是您所定义的定义了一个成员函数,它应该具有语法

Matrix operator+(int b) {

因为this是一个成员函数。有关讨论细微差别的示例,请参阅此回答。

同样,你的赋值操作符也不正确。

Matrix& operator=(const Matrix& a) {

是最常见的形式,尽管参数的格式可以改变,但您需要为返回值返回一个引用。