超载操作员问题C++

Overloaded operator issue C++

本文关键字:C++ 问题 操作员 超载      更新时间:2023-10-16

我遇到了一个似乎无法正常工作的重载运算符的问题。以下是我的代码。

帐户。H

#ifndef SICT_ACCOUNT_H__
#define SICT_ACCOUNT_H__
#include <iostream>
#define MAX_NAME 40
namespace sict
{
class Account
{
char name_[MAX_NAME+1];
double balance_;
public:
Account();
Account(double);
Account(const char*, double = 0.0);
void display(bool = true) const;
Account& operator=(const Account&);
Account& operator+=(const Account&);
friend Account operator+(Account&, const Account&);
};
std::ostream& operator<<(std::ostream& os, const Account& a);
};
#endif

帐户。.CPP

#include <cstring>
#include <iomanip>
#include "Account.h"
namespace sict
{
Account::Account()
{
name_[0] = '';
balance_ = 0;
}
Account::Account(double balance)
{
name_[0] = '';
balance_ = balance;
}
Account::Account(const char name[], double balance)
{
name_[MAX_NAME] = '';
strncpy(name_, name, MAX_NAME);
balance_ = balance;
}
void Account::display(bool gotoNewline) const
{
std::cout << (name_[0] ? name_: "No Name") << ": $" << std::setprecision(2) << std::fixed << balance_;
if(gotoNewline)
{
std::cout << std::endl;
}
}
std::ostream& operator<<(std::ostream& os, const Account& a)
{
a.display();
return os;
}
Account& Account::operator=(const Account& c)
{
balance_ = c.balance_;
name_[MAX_NAME] = '';
strncpy(name_, c.name_, MAX_NAME);
return *this;
}
Account& Account::operator+=(const Account& b)
{
balance_ += b.balance_;
return *this;
}
Account operator+(Account& a, const Account& b)
{
return a.balance_ + b.balance_;
}

}

主要

#include <iostream>
#include "Account.h"
using namespace sict;
void displayABC(const Account& a, const Account& b, const Account& c)
{
std::cout << "A: " << a << std::endl << "B: " << b << std::endl
<< "C: " << c << std::endl << "--------" << std::endl;
}
int main()
{
Account a;
Account b("Saving", 10000.99);
Account c("Checking", 100.99);
displayABC(a, b, c);
a = b + c;
displayABC(a, b, c);
a = "Joint";
displayABC(a, b, c);
a = b += c;
displayABC(a, b, c);
a = b += c += 100.01;
displayABC(a, b, c);
return 0;
}

我应该得到的输出是

A: No Name: $0.00
B: Saving: $10000.99
C: Checking: $100.99
--------
A: No Name: $10101.98
B: Saving: $10000.99
C: Checking: $100.99
--------
A: Joint: $10101.98
B: Saving: $10000.99
C: Checking: $100.99
--------
A: Saving: $10101.98
B: Saving: $10101.98
C: Checking: $100.99
--------
A: Saving: $10302.98
B: Saving: $10302.98
C: Checking: $201.00

这就是我现在得到的

A: No Name: $0.00
B: Saving: $10000.99
C: Checking: $100.99
--------
A: No Name: $10101.98
B: Saving: $10000.99
C: Checking: $100.99
--------
A: Joint: $0.00
B: Saving: $10000.99
C: Checking: $100.99
--------
A: Saving: $10101.98
B: Saving: $10101.98
C: Checking: $100.99
--------
A: Saving: $10302.98
B: Saving: $10302.98
C: Checking: $201.00
--------

如您所见,显示的整数值为 0:

答:联合:0.00 美元。

我似乎无法弄清楚这一点。 任何帮助不胜感激!

displayABC(a, b, c);
a = b + c;
displayABC(a, b, c);
a = "Joint"; //The Problem!!
displayABC(a, b, c);
a = b += c;
displayABC(a, b, c);
a = b += c += 100.01;
displayABC(a, b, c);

您尚未为字符串对象定义特定operator=,因此,编译器正在替换构造函数Account(const char name[], double balance = 0.0),由于未指定平衡,因此将平衡设置为 0。

应将关键字explicit添加到构造函数以防止它这样做,或者添加额外的重载以允许在不更改平衡的情况下设置名称。

explicit Account::Account(const char name[], double balance)
{
name_[MAX_NAME] = '';
strncpy(name_, name, MAX_NAME);
balance_ = balance;
}

顺便说一下,在 c++ 世界中,您应该将任何和所有类型const char *的引用替换为std::string,并将其存储在您的对象中。唯一应该使用 c 字符串的情况是必须与 c 库接口。

a = "Joint";

其实是

a = Account("Joint");

所以

a = Account("Joint", 0.0);

所以重置a平衡。

你正在按照你的要求覆盖a

a = "Joint";

相当于

a = Account("Joint");

这将创建一个新帐户,并使用分配运算符将新创建的Account分配给a

应将构造函数标记为explicit,并为帐户名称创建一个资源库。