1

我对操作员操作加载概念很陌生,之前提出的相关问题比我早,所以我需要问一个基本问题。

这是.h文件:

#define ACCOUNT_H

using namespace std;

class Account{
  friend Account &operator+ (Account &acc);
  friend ostream &operator<< (ostream &, Account &);

  public:
    Account(double=100.0,double=0.0,double=0.0);

    Account &returnSum(Account &otherAccount) const;
    Account& operator+=(Account &Acc1);

    void setT(double);
    void setD(double);
    void setE(double);
    double getT(void);
    double getD(void);
    double getE(void);
    void printAccount();

  private:
    double t;
    double d;
    double e;
};

#endif

我需要+作为全局函数重载“带有单个参数”(这对我来说是具有挑战性的部分)和+=成员函数(在这里我假设我不能采用右侧操作数,因为它是一个成员函数,所以是有问题的部分)。这是我的实现+=

Account &Account ::operator+=(Account &Acc1){
   Account *result = new Account(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = *result;
   return *this;
}

如果您能纠正这一点+=并为我写一个重载实现,我将不胜感激+。我只需要将 t,d,e 值添加为 Account 对象。

4

2 回答 2

6

如果您想operator+作为免费功能,您需要:

friend Account operator+ (const Account &acc, const Account &secondAcc);

此外,operator +是一个二元运算符,因此它不可能只接收一个参数。即使是成员函数,它也需要 2 个参数,只是第一个参数 ,this是在后台传递的。

所以,你的两个选择:

1) 会员运营商

class Account{
    Account operator+ (const Account &acc);
};

2) 自由运营商

class Account{
    friend Account operator+ (const Account &acc, const Account &secondAcc);
};

Account operator+ (const Account &acc, const Account &secondAcc)
{
}

非常重要 1

请注意,我是按值返回,而不是像您那样引用。这是为了防止 UB,因为您可能会返回一个局部变量,通过引用返回该变量是非法的。

非常重要2

Account &Account ::operator+=(Account &Acc1){

   Account *result = new Account(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = *result;

   return *this;

}

此代码将泄漏。为什么不使用自动存储变量:

Account &Account ::operator+=(Account &Acc1){
   Account result(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = result;
   return *this;
}

仍然不确定里面的逻辑,但至少它不会泄漏内存。你现在拥有它的方式,你正在修改参数,而不是你调用的对象+=。所以之后,说,a+=b仍然a是一样的,并且b会被修改。

于 2012-05-27T18:33:45.503 回答
1
Account &Account ::operator+=(Account &Acc1){
   Account *result = new Account(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = *result;
   return *this;
}

这里有两个大问题。一个是 Luchian Grigore 提到的泄漏。另一个是这与 operator+= 的行为方式不同。问题是您正在修改Acc1. 你应该修改this. 以下代码在您的重载时会表现得非常奇怪:

Account total;
Account joes_account;
...
total += joes_account;

使用您的代码,它是joes_account用 sum 而不是 variable 更新的total

于 2012-05-27T19:16:29.343 回答