C++ 重载运算符问题C++;

C++ 重载运算符问题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:

我遇到了一个重载运算符的问题,该运算符似乎工作不正常。下面是我的代码

账户.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
这就是我现在所得到的结果

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");