我有一个包含一些 int 数组的类。我想重载 * 运算符,以便它将每个元素乘以一定数量。类很常见。
class TEST{
public:
TEST(){
size = 5;
arr = new double[size]();
}
double &operator [] ( const int a ){
return arr[a];
}
TEST operator *( const int a ){
for( int i = 0; i < size ;i++){
arr[i] = arr[i] * a;
}
return *this;
}
private:
int size;
double *arr;
}
当我调用它时
TEST one;
one[1]=5;
one[0]=-10;
one[3]=4
one = one * 2
并打印它,result 的值,0 索引始终是内存中的随机数,就像它没有 0 索引一样;这仅在 one = one * 2
之后发生。是 *this
造成的吗?如果是这样,为什么以及如何解决?
// 我已将 * 声明为
TEST operator *( const int a ){
TEST temp;
for( int i = 0; i < size ;i++){
temp.arr[i] = arr[i] * a;
}
return temp;
}
并声明拷贝构造函数
TEST( const TEST &a){
size = a.size;
arr = new double;
*arr = *a.arr;
}
它仍然抛出随机数字作为 0 索引
最佳答案
下标运算符应该这样定义
double & operator [] ( int a ){
return arr[a];
}
和
double operator [] ( int a ) const {
return arr[a];
}
或
const double & operator [] ( int a ) const {
return arr[a];
}
operator *
应按以下方式定义
TEST operator *( int a ) const {
TEST tmp;
for( int i = 0; i < size ;i++){
tmp.arr[i] = arr[i] * a;
}
return tmp;
}
或者声明也可以看起来像
const TEST operator *( int a ) const;
^^^^^
您还需要至少(除了析构函数和复制构造函数之外)显式定义复制赋值运算符。
这是一个演示程序
#include <iostream>
class TEST
{
public:
TEST() : size( 5 ), arr( new double[size]() )
{
}
~TEST()
{
delete []arr;
}
TEST & operator =( const TEST &rhs )
{
for( int i = 0; i < size ;i++ ) arr[i] = rhs.arr[i];
return *this;
}
double & operator [] ( int n )
{
return arr[n];
}
const double & operator [] ( int n ) const
{
return arr[n];
}
TEST operator *( int x ) const
{
TEST tmp;
for ( int i = 0; i < size ;i++ )
{
tmp.arr[i] = x * arr[i];
}
return tmp;
}
int count() const
{
return size;
}
private:
int size;
double *arr;
};
int main()
{
TEST one;
one[1] = 5;
one[0] =-10;
one[3] = 4;
one = one * 2;
for( int i = 0; i < one.count() ;i++ ) std::cout << one[i] << ' ';
std::cout << std::endl;
}
它的输出是
-20 10 0 8 0
编辑:您在我回答后使用我回答中显示的代码更改您的帖子是个坏主意。您的复制构造函数无效。它只创建一个 double 类型的对象而不是一个数组。
关于c++ - 返回 *this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36388928/