C++ 操作员不应';不可能是恒定的,但也可能是恒定的

C++ 操作员不应';不可能是恒定的,但也可能是恒定的,c++,class,variables,constants,operator-keyword,C++,Class,Variables,Constants,Operator Keyword,我实现了一个类MyMatrix,它包含一个指向抽象类矩阵的指针(指针是_矩阵)。 运算符+=调用add方法并添加_矩阵变量。 因此,类变量_矩阵发生变化,因此+=运算符不能为常数, 但出于某种原因,编译器允许我将其设置为const,并且没有异常。 为什么呢 const MyMatrix& MyMatrix::operator +=(const MyMatrix& other) const { _matrix->add(*other._matrix); ret

我实现了一个类MyMatrix,它包含一个指向抽象类矩阵的指针(指针是_矩阵)。 运算符+=调用add方法并添加_矩阵变量。 因此,类变量_矩阵发生变化,因此+=运算符不能为常数, 但出于某种原因,编译器允许我将其设置为const,并且没有异常。 为什么呢

const MyMatrix& MyMatrix::operator +=(const MyMatrix& other) const
{
    _matrix->add(*other._matrix);
    return *this;
}
这是补充:

void add(Matrix &other)
{
    for (int i = 0; i < other.getSize(); i++)
    {
        Pair indexPair = other.getCurrentIndex();
        double value = other.getValue(indexPair);
        pair<Pair, double> pairToAdd(indexPair, value);
        other.next();
        if (pairToAdd.second != 0)
        {
            setValue(pairToAdd.first, getValue(pairToAdd.first) + pairToAdd.second);
        }
    }
    initializeIterator();
}  
void添加(矩阵和其他)
{
对于(int i=0;i
const方法使:

Matrix* _matrix;
指针常量,采用以下方式:

Matrix* const _matrix;
不是这样的:

const Matrix* _matrix;
也就是说,指针是常量,而不是指针对象。因此,您可以在
\u矩阵上调用非常量方法


如果您想强制const方法中的指针对象为const,请使用
运算符+=
中的技巧,因为您很可能已将
\u矩阵
成员声明为简单指针。因此,
operator+=
不会更改
MyMatrix
的状态,因为您没有更改指针,而是更改指向的对象


由您决定将
运算符+=
声明为常量是否是一个好主意。即使编译器允许,也很可能不是这样。它只会让类的用户感到困惑。

我们需要查看其余的代码,特别是类定义。也许
add
是(错误的?
const
)。(也许
add
返回加法的结果,而这个
操作符实际上没有改变任何东西?)您可以添加
Matrix::add
函数的签名和_Matrix?
\u Matrix->add(*other.\u Matrix)的声明吗
甚至不应该编译,除非
\u矩阵
是可变的
和/或
add()
也是常量
。add()不是常量,且_矩阵不可变。@greg是
\u矩阵
指针吗?我相信在另一个问题中已经提到,成员函数上的
const
限定符使指针数据成员变成
T*const T
,而不是
const T*T