C++day5

思维导图

搭建一个货币的场景,创建一个名为 RMB 的类,该类具有整型私有成员变量 yuan(元)、jiao(角)和 fen(分),并且具有以下功能:

(1)重载算术运算符 + 和 -,使得可以对两个 RMB 对象进行加法和减法运算,并返回一个新的 RMB 对象作为结果。

(2)重载关系运算符 >,判断一个 RMB 对象是否大于另一个 RMB 对象,并返回 true 或 false。

(3)重载前置减减运算符 --,使得每次调用时 RMB 对象的 yuan、jiao 和 fen 分别减 1

(4)重载后置减减运算符 --,使得每次调用时 RMB 对象的 yuan、jiao 和 fen 分别减 1

(5)另外, RMB 类还包含一个静态整型成员变量 count,用于记录当前已创建的 RMB 对象的数量。每当创建一个新的 RMB 对象时,count 应该自增 1;每当销毁一个 RMB 对象时,count 应该自减 1。

要求,需要在main 函数中测试上述RMB 类的功能。

#include <iostream>

using namespace std;

class RMB
{
        friend bool operator> (const RMB &l,const RMB &r);
        friend istream &operator>>(istream &cin, RMB &r);
        friend void compare(const RMB &l,const RMB &r);
        friend RMB operator ++(RMB &u);
        friend const RMB operator --(RMB &u,int);
    private:
        int yuan;
        int jiao;
        int fen;
        string name;
        static int count;
    public:
        //无参构造函数
        RMB()
            {
                count++;
            }
        //有参构造函数,初始化用户名以及操作金额
        RMB(int yuan,int jiao,int fen,string name):yuan(yuan),jiao(jiao),fen(fen),name(name)
            {
                cout<<"用户"<<name<<"加入"<<endl<<"操作金额:"<<yuan<<"元"<<jiao<<"角"<<fen<<"分"<<endl<<"==============================="<<endl;
                count++;
            }
        //析构函数
        ~RMB()
            {
                count--;
            }
        //展示余额
        void show()
            {
                cout<<"用户:"<<name<<endl<<"余额:"<<yuan<<"元"<<jiao<<"角"<<fen<<"分"<<endl<<"==============================="<<endl;
            }
        //成员函数执行加操作
        const RMB operator+ (const RMB &r)const
            {
                RMB temp;
                temp.name=name;
                cout<<temp.name<<"执行'+'操作"<<endl<<"==============================="<<endl;
                temp.yuan=yuan+r.yuan;
                temp.jiao=jiao+r.jiao;
                temp.fen=fen+r.fen;
                //判断进位
                if(temp.fen>=10)
                    {
                        temp.fen-=10;
                        temp.jiao+=1;
                    }
                if(temp.jiao>=10)
                    {
                        temp.jiao-=10;
                        temp.yuan+=1;
                    }
                return temp;
            }
        //成员函数执行减操作
        const RMB operator- (const RMB &r)const
            {
                RMB temp;
                temp.name=name;
                cout<<temp.name<<"执行'-'操作"<<endl<<"==============================="<<endl;
                temp.yuan=yuan-r.yuan;
                temp.jiao=jiao-r.jiao;
                temp.fen=fen-r.fen;
                //判断借位
                if(temp.fen<0)
                    {
                        temp.fen+=10;
                        temp.jiao-=1;
                    }
                if(temp.jiao<0)
                    {
                        temp.jiao+=10;
                        temp.yuan-=1;
                    }
                if(temp.yuan<0)
                    {
                        cout<<"余额不足!"<<endl;
                    }
                return temp;
            }
};
//初始化静态变量count
int RMB::count=0;
//全局函数实现提取符重载
istream &operator>>(istream &cin, RMB &u)
{
    cin >>u.yuan>>u.jiao>>u.fen>>u.name;
    cout<<"用户"<<u.name<<endl<<"操作金额:"<<u.yuan<<"元"<<u.jiao<<"角"<<u.fen<<"分"<<endl<<"==============================="<<endl;
    return  cin;
}
//全局函数执行判断‘>’操作
bool operator> (const RMB &l,const RMB &r)
    {
        cout<<l.name<<"与"<<r.name<<"执行'>'操作"<<endl<<"==============================="<<endl;
        if(l.yuan>r.yuan)
            {
                return true;
            }
        else if(l.yuan==r.yuan)
            {
                if(l.jiao>r.jiao)
                    {
                        return true;
                    }
                else if(l.jiao==r.jiao)
                    {
                        if(l.fen>r.fen)
                            {
                                return true;
                            }
                        else
                            {
                                return false;
                            }
                    }
                else if(l.jiao<r.jiao)
                    {
                        return false;
                    }
            }
        else if(l.yuan<r.yuan)
            {
                return false;
            }
        return 1;//防止出现无返回值的情况
    }
//定义一个函数专门用来提示比较结果
void compare(const RMB &l,const RMB &r)
    {
        if(l>r)
            {
                cout<<l.name<<">"<<r.name<<endl<<"==============================="<<endl;
            }
        else
            {
                cout<<l.name<<"<"<<r.name<<endl<<"==============================="<<endl;
            }
    }
//全局函数实现前++运算符重载
RMB operator ++(RMB &u)
    {
        cout<<u.name<<"执行'前++'操作"<<endl<<"==============================="<<endl;
        u.yuan+=1;
        u.jiao+=1;
        u.fen+=1;
        if(u.fen>=10)
            {
                u.fen-=10;
                u.jiao+=1;
            }
        if(u.jiao>=10)
            {
                u.jiao-=10;
                u.yuan+=1;
            }
        return u;
    }
//全局函数实现后--运算符重载
const RMB operator --(RMB &u,int)
    {
        cout<<u.name<<"执行'后--'操作"<<endl<<"==============================="<<endl;
        RMB temp;
        temp.yuan=u.yuan--;
        temp.jiao=u.jiao--;
        temp.fen=u.fen--;
        if(u.fen<0)
            {
                u.fen+=10;
                u.jiao-=1;
            }
        if(u.jiao<0)
            {
                u.jiao+=10;
                u.yuan-=1;
            }
        if(u.yuan<0)
            {
                cout<<"余额不足!"<<endl;
            }
        return temp;
    }
int main()
    {
        RMB user1(10,8,9,"蔡徐坤");
        RMB add;
        cin>>add;
        RMB updateuser1;
        updateuser1=user1+add;
        updateuser1.show();
        RMB sub;
        cin>>sub;
        updateuser1=updateuser1-sub;
        updateuser1.show();
        RMB user2(8,6,9,"马嘉祺");
        compare(updateuser1,user2);
        ++user2;
        user2.show();
        RMB user3=user2--;
        user3.show();
        user2.show();
        return 0;
    }

C++ 标准库中,并没有名为 `day_iterator` 的参数或类型。可能用户提到的 `day_iterator` 是对某些迭代器(iterator)概念的一种误解,或者是特定库中的自定义类型。 在标准库中,与日期相关的功能主要出现在 `<chrono>` 头文件中,而 C++20 引入了更完整的日期和时间处理功能,包括 `std::chrono::year_month_day` 和相关的日期操作。然而,C++ 标准库并未提供专门的 `day_iterator` 类型用于遍历日期。 如果需要实现类似功能,可以自定义一个日期迭代器,例如使用 `std::chrono` 中的日期操作来实现逐日递增的迭代器[^1]。 以下是一个简单的示例,展示如何使用 C++20 的 `<chrono>` 库来实现一个“按天递增”的迭代器: ```cpp #include <iostream> #include <chrono> namespace chrono = std::chrono; class day_iterator { private: chrono::sys_days _current; public: using iterator_category = std::forward_iterator_tag; using value_type = chrono::sys_days; using difference_type = std::ptrdiff_t; using pointer = const chrono::sys_days*; using reference = const chrono::sys_days&; explicit day_iterator(chrono::sys_days start) : _current(start) {} reference operator*() const { return _current; } pointer operator->() const { return &_current; } day_iterator& operator++() { _current += chrono::days(1); return *this; } day_iterator operator++(int) { day_iterator tmp = *this; ++(*this); return tmp; } bool operator==(const day_iterator& other) const { return _current == other._current; } bool operator!=(const day_iterator& other) const { return !(*this == other); } }; int main() { // 从 2023-10-01 开始 auto start_date = chrono::sys_days{chrono::year(2023)/10/1}; auto end_date = chrono::sys_days{chrono::year(2023)/10/6}; day_iterator begin(start_date); day_iterator end(end_date); for (auto it = begin; it != end; ++it) { auto ymd = chrono::year_month_day(*it); std::cout << static_cast<std::string>(ymd) << std::endl; } return 0; } ``` 该程序输出如下内容: ``` 2023-10-01 2023-10-02 2023-10-03 2023-10-04 2023-10-05 ``` 上述代码展示了如何创建一个前向迭代器,用于遍历从起始日期到结束日期之间的每一天。这个自定义的 `day_iterator` 实现了基本的迭代器接口,支持前置递增、解引用和比较操作。 ### 示例说明 - 使用 `std::chrono::sys_days` 表示系统时钟上的日期。 - 每次调用 `operator++()` 都会将当前日期增加一天。 - 迭代器支持与标准算法兼容的接口,例如 `begin()` 和 `end()`。 ### 注意事项 - 该实现是前向迭代器(`std::forward_iterator_tag`),不支持双向或随机访问。 - 如果未使用 C++20 或 `<chrono>` 的日历功能,可能需要依赖第三方库如 Boost.Date_Time 来实现类似的日期迭代功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值