c++ - 返回 *this

标签 c++ class operator-overloading operators

我有一个包含一些 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/

相关文章:

c++ - 基于文本的冒险游戏

c++ - 插入 map 时多次调用析构函数

c++ - 无法从 friend 类访问私有(private)和公共(public)成员

C++ 比较运算符重载令人困惑的行为

c# - 同时自动检测 COM-Port 和 WriteLine

c++ - 如何从 C++ 中的整数缓冲区中提取 4 个字节的整数

java - 实现比较方法的 Comparable 接口(interface)的 Widget 类

java - 实例与对象

c++ - 优先队列的语法

c++ - 如何正确实现返回 ref 的运算符重载,以便轻松删除它们的工件?