C++ 运算符重载和指向对象的指针,c++;

C++ 运算符重载和指向对象的指针,c++;,c++,operator-overloading,C++,Operator Overloading,我构建了一个表示矩阵的类,并覆盖了所有 算术运算符。下面是一个重载一元负号的示例 RegMatrix.h: const RegMatrix operator - (); RegMatrix.cpp const RegMatrix RegMatrix::operator - () { RegMatrix newMatrix(*this); newMatrix *= -1; return newMatrix; } 现在,当我像这样实例化堆栈上的对象时,这就完美了:RegM

我构建了一个表示矩阵的类,并覆盖了所有 算术运算符。下面是一个重载一元负号的示例

RegMatrix.h:

const RegMatrix operator - ();
RegMatrix.cpp

const RegMatrix RegMatrix::operator - ()
{
    RegMatrix newMatrix(*this);
    newMatrix *= -1;
    return newMatrix;
}
现在,当我像这样实例化堆栈上的对象时,这就完美了:
RegMatrix a(3,3,v)
(v是值的向量,不重要)。 当我像这样使用
new
关键字时(在main.cpp中):

RegMatrix*a=新的RegMatrix(3,3,v);

RegMatrix*b=-a//
a
的类型是
RegMatrix*
,而不是
RegMatrix
;如果要在
a
指向的对象上应用运算符,则必须取消引用
a
*a
),将运算符应用于该对象(
-(*a)
),如果要在堆上为其创建一个单独的实例,请使用
new
和复制构造函数在堆上创建该对象的新副本:

RegMatrix* a = new RegMatrix(3,3,v);
RegMatrix* b = new RegMatrix(-(*a));

不过,正如@ LealTaTuffAn在评论中指出的,这不是一个在C++中工作的好方法,在这里,作为经验法则,如果你可以避免动态分配(如果你不想内存泄漏),你就尽量避免动态分配。

< P>类型> < <代码> >代码> ReGrime*< /Cord>,而不是<代码> ReGrime;如果要在
a
指向的对象上应用运算符,则必须取消引用
a
*a
),将运算符应用于该对象(
-(*a)
),如果要在堆上为其创建一个单独的实例,请使用
new
和复制构造函数在堆上创建该对象的新副本:

RegMatrix* a = new RegMatrix(3,3,v);
RegMatrix* b = new RegMatrix(-(*a));

不过,正如@ LealTaTuffAn在评论中指出的,这不是一个在C++中工作的好方法,在这里,作为经验法则,如果你可以(如果你不想内存泄漏),它会避免动态分配(它需要慢指针)。

<代码>运算符=/COD>不被复制构造函数所覆盖。你必须自己重写它。但是,如果在声明时使用
=
运算符,则将调用复制构造函数。在其他任何地方,都会调用
运算符=
。@Etienne de Martel:
运算符=
不会被覆盖,但会被重载。该标准特别要求在要重写的函数上使用virtual关键字。我总是混淆这两个术语。
运算符=
不会被复制构造函数覆盖。你必须自己重写它。但是,如果在声明时使用
=
运算符,则将调用复制构造函数。在其他任何地方,都会调用
运算符=
。@Etienne de Martel:
运算符=
不会被覆盖,但会被重载。该标准特别要求在要重写的函数上使用virtual关键字。我总是混淆这两个术语。它总是值得提到的,在C++中,这通常不是一个很好的方法。@左TrAuthOnt:是的,我将添加一个关于它的线。它总是值得提到的是,这通常不是一个很好的方法,在C++中。@左撇子:是的,我将添加一个关于它的线。