C++ 重载运算符问题C++;
我遇到了一个重载运算符的问题,该运算符似乎工作不正常。下面是我的代码 账户.HC++ 重载运算符问题C++;,c++,c++11,operator-overloading,C++,C++11,Operator Overloading,我遇到了一个重载运算符的问题,该运算符似乎工作不正常。下面是我的代码 账户.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:
#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
这就是我现在所得到的结果
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:
A:联合:0.00美元
我似乎无法理解这一点。感谢您的帮助
a = "Joint";
事实上
a = Account("Joint");
所以
因此,重置a
余额
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);
您尚未为字符串对象定义特定的运算符=
,因此,编译器正在构造函数帐户(const char name[],double balance=0.0)
中进行替换,因为没有指定余额,因此正在将余额设置为0
您应该向构造函数添加关键字explicit
,以防止它这样做,或者添加额外的重载以允许在不改变平衡的情况下设置名称
explicit Account::Account(const char name[], double balance)
{
name_[MAX_NAME] = '\0';
strncpy(name_, name, MAX_NAME);
balance_ = balance;
}
顺便说一下,在C++世界中,您应该用<代码> STD::String < /Cord>替换类型>代码> const char */COD>的所有引用,并将其存储在对象中。您唯一应该使用c-string的时间是在必须与c-library接口的情况下。
您正在按照您的指示覆盖a
a = "Joint";
相当于
a = Account("Joint");
它将创建一个新帐户,并使用赋值运算符将新创建的帐户
赋值给a
您应该将构造函数标记为显式,并为帐户名创建一个setter
a=“关节”代码>这一行应该发生什么?它使用=运算符并将名称“Joint”添加到当前对象中。@a-one--您对注释的回答表明您没有进行真正的调试。您应该看到,a
在执行该行后立即重置。然后,您的问题将被问到一个更集中的情况,即“为什么我执行这行时我的对象被重置?”,而不仅仅是“重载无法正常工作”。调试是你必须学会做的事情,因为它是学习如何编写程序的一部分。你的朋友operator+()
应该有两个参数const和(或者按值传递第一个参数并在副本上使用+=
)好的,我明白了,我是一名第二学期的学生,但我没有意识到这一点。将来我将使用调试器。上次也有人建议我。他应该给构造函数添加explicit
,而不是assignment操作符。嗨,我添加了explicit并得到了这个错误帐户。cpp:41:18:错误:预期的非限定id帐户和显式帐户::操作符=(const Account&c)@a-one@revolver\u ocelot我做了编辑。我可以发誓explicit
对运算符重载有效,但显然无效。我将其添加到构造函数中,并收到此“explicit”只能在类定义中指定OK将来肯定会考虑到这一点。
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);
explicit Account::Account(const char name[], double balance)
{
name_[MAX_NAME] = '\0';
strncpy(name_, name, MAX_NAME);
balance_ = balance;
}
a = "Joint";
a = Account("Joint");