超载操作员问题C++
Overloaded operator issue C++
我遇到了一个似乎无法正常工作的重载运算符的问题。以下是我的代码。
帐户。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
,并为帐户名称创建一个资源库。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题