gpt4 book ai didi

c++ - C++ 中的运算符重载 + 和 +=

转载 作者:行者123 更新时间:2023-11-30 00:38:29 25 4
gpt4 key购买 nike

我对运算符加载概念非常陌生,之前提出的相关问题远远领先于我,所以我需要问一个基本问题。

这是 .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 值添加为帐户对象。

最佳答案

如果你想将 operator+ 作为一个免费函数,你需要:

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

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

那么,你的两个选择:

1) 成员(member)运营商

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 将被修改。

关于c++ - C++ 中的运算符重载 + 和 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10776288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com