C++ 为什么当我尝试将一个数字加上一个矩阵求和时,运算符重载失败了?(但效果正好相反)

C++ 为什么当我尝试将一个数字加上一个矩阵求和时,运算符重载失败了?(但效果正好相反),c++,constructor,operator-overloading,C++,Constructor,Operator Overloading,下面是我的矩阵类的代码: class Matrix3{ public: double matrix [3][3]; 所需的构造函数和+运算符: Matrix3::Matrix3(double num){ for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) matrix[i][j] = num; } Matrix3::Matrix3(const Matrix3 &

下面是我的矩阵类的代码:

class Matrix3{
public:
    double matrix [3][3];
所需的构造函数和+运算符:

Matrix3::Matrix3(double num){
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            matrix[i][j] = num;
}

Matrix3::Matrix3(const Matrix3 &other){
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            this->matrix[i][j] = other.matrix[i][j];
}

Matrix3 Matrix3::operator+(const Matrix3& other) const{
    Matrix3 temp(*this);
    for(int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            temp.matrix[i][j] += other.matrix[i][j];

    return temp;
}
所以我不明白为什么第一个有效。在这两种情况下,它都应该创建一个矩阵,其中所有元素都是3,因为有一个构造函数用于该矩阵,并将其添加到另一个矩阵中。
有什么想法吗?

这是因为您将运算符+声明为成员函数。这是一个坏主意,因为正是您发现的问题。当操作符+是成员函数时,C++编译器将在右手边进行自动转换,而不是在左手边进行自动转换。 通过使运算符+成为具有两个参数的全局函数来修复此问题

Matrix3 operator+(const Matrix3& lhs, const Matrix3& rhs) {
    ...
}

现在,从
double
Matrix
的转换将在任一参数上完成。

与您的问题无关--
Matrix3::Matrix3(double num)
作为显式构造函数会更好。我觉得把一个
double
隐式转换成
Matrix3
不合适。这是大学里的一项任务(我是初学者)我必须编写一个矩阵类,它可以由9个元素或单个数字组成的数组来定义,在这种情况下,矩阵中的所有数字都必须是单个数字。我以前试过,但它不起作用,但我想我错过了一些东西,因为它现在起作用了。谢谢。当矩阵中没有明确定义转换运算符时,如何自动将双对象转换为“矩阵”对象class@PiyushSingh转换是由于非显式构造函数Matrix3::Matrix3(double num)而发生的{我明白了。它使用其中一个构造函数作为转换运算符;之所以有效,是因为该构造函数采用双精度作为参数。但是假设我说
intb=5;a1=a1+b;
。那么它会将int转换为双精度,将double转换为矩阵吗?@piyussingh我相信只有一个自动转换被应用。但是规则很复杂,我可以我很容易出错。
Matrix3 operator+(const Matrix3& lhs, const Matrix3& rhs) {
    ...
}