C++ 运算符重载和指向对象的指针,c++;
我构建了一个表示矩阵的类,并覆盖了所有 算术运算符。下面是一个重载一元负号的示例 RegMatrix.h: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
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++中。@左撇子:是的,我将添加一个关于它的线。