当前位置: 首页 > news >正文

C++ 写一个Data类的注意问题

 Data类

声明和定义分离的一些问题

声明里面我们不带缺省参数,定义我们给缺省参数,如下面两段代码:

Data.h#pragma once
#include<iostream>
using namespace std;
class Data
{
public:Data(int year,int month,int day);private:int _year;int _month;int _day;};
Data.cpp#include"Data.h"Data::Data(int year=1 , int month=1 , int day=1 ){_year = year;_month = month;_day = day;}

现在我们在main函数调用:

d1没报错,d2报错了:

这是因为我们main函数那个文件包的是.h文件,声明我们没有给缺省参数,声明就好比一种承诺,

没给参数,我们d2没有默认参数就过不了。

我们给个默认参数看看:

#pragma once
#include<iostream>
using namespace std;
class Data
{
public:Data(int year = 1, int month = 1, int day = 1);
private:int _year;int _month;int _day;};

声明和定义不能同时给默认参数,我们把定义的默认参数去了就可以了。

OK,我们写个print函数就可以把日期打印出来看看了:

Data.cppvoid Data:: print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}

我们发现上面这段日期是有问题的,有点的是闰年,有的是13月,是一些不合法日期,所以我们要加日期有效判断。

日期判断

引用上一篇文章写的:

int Getmonth(int year,int month){int GetArry[13] = {0, 31,28,30,31,30,31,30,31,30,31,30,31 };if (month==2&&(month % 4 == 0 && month % 10 == 0 || month % 400 != 0)){return 29;}return GetArry[month];}

可以在Getmonth函数前面加一个static,因为Getmonth肯定会被频繁调用,每一次都进来会造成消耗,所以用static让它具有全局属性。

然后我们给输入的日期加判断:

拷贝构造

日期类需不需要我们自己写拷贝构造,不需要,因为日期类就三个成员变量:int _year ,int _month,int  _day,全是内置类型,编译器会自动生成拷贝构造:

    Data d1(2003,11,33);d1.print();Data d2(d1);d2.print();

运算符重载


bool Data::operator<=(Data d2)
{if (_year <= d2._year){return true;}if (_year <= d2._year && _month <= d2._month){return true;}if (_year <= d2._year && _month <= d2._month && _day <= d2._day){return true;}else{return false;}
}bool Data::operator==(Data d2)
{return _year == d2._year&& _month == d2._month&& _day == d2._day;
}bool Data::operator>=(Data d2)
{return !(*this <= d2) || *this == d2;
}bool Data::operator<(Data d2)
{return !(*this <= d2);
}bool Data:: operator!=(Data d2)
{return !(*this == d2);
}

赋值运算符重载

Data& Data::operator=(const Data& d3)
{this->_year = d3._year;this->_month = d3._month;this->_day = d3._day;return *this;
}
Data d1(2003, 11, 33);Data d3(2003, 11, 22);Data d4(2000, 12, 3);d1 = d3 = d4;d1.print();d3.print();d4.print();

用operator+ 实现两个日期类相加

用+运算符重载实现两个日期类相加。

 直接用上篇文章的内容,如下代码实现两个日期类相加:

Data& Data:: operator+(int  day)
{Data temp(*this);//天数相加temp._day += day;//如果月满了while (temp._day > Getmonth(_year, _month)){//天数减去满月的天数temp._day -= Getmonth(_year, _month);//从当前月进入下一个月++temp._month;}//如果12个月都满了if (temp._month == 13){//当前年进入下一年++temp._year;//把月置为下一年的一月temp._month = 1;}return temp;
}
	mainData d1(2003, 11, 29);Data d2 = d1 + 200;d1.print();d2.print();

 原因:

通过调试发现,都已经超过12月了,还没有进入month==13的判断里面,这是因为whil循环没结束,要么改while循环条件,要么把month==13的if判断放到while里面修改后的代码:

static int  Getmonth(int year, int month)
{int GetArry[13] = { 0, 31,28,30,31,30,31,30,31,30,31,30,31 };if (month == 2 && (year% 4 == 0 && year % 100 == 0 || year % 400 != 0)){return 29;}return GetArry[month];
}Data& Data::operator+=(int day)
{*this += day;return *this;
}Data& Data:: operator+(int  day)
{Data temp(*this);//天数相加temp._day += day;//如果月满了while (temp._day > Getmonth(_year, _month)){//天数减去满月的天数temp._day -= Getmonth(_year, _month);//从当前月进入下一个月++temp._month;//如果12个月都满了if (temp._month == 13){//当前年进入下一年++temp._year;//把月置为下一年的一月temp._month = 1;}}return temp;
}
mainData d1(2003, 11, 29);d1 += 200;d1.print();

复用 ”+"实现 “+=”

 

注意不能这样写:

因为我们要服用 "operator+"实现"+=”功能,所以不能使用  “+=",因为"+="功能还没实现。

运行:

Data d1(2003, 11, 29);d1 += 200;d1.print();

 

operator-=

Date& Date:: operator-=(int  day)
{_day -= day;while (_day <=0){--_month;if (_month == 0){_year;_month = 12;}_day += Getmonth(_year, _month);}return *this;
}

 

如果我们这样写呢?

Date d1(2003, 11, 29);d1 -= -2000;d1.print();

 会偏移预期效果:

 因为我们没有考虑day为负数的情况。

d1-=2000   ==> d1=d1=-(-2000)  ==>d1=d1+2000  ==>d1+=2000;

我们复用一下operator+=就可以了。

Date& Date:: operator-=(int  day)
{if (day < 0){return *this += (-day);}

 同样的

Date d1(2003, 11, 29);d1 += -2000;d1.print();

也可以复用operator-=

没改之前:

 改了之后:

Date& Date::operator+=(int day)
{if (day < 0){return *this -= day;}*this =*this+day;return *this;
}

 

相关文章:

C++ 写一个Data类的注意问题

Data类 声明和定义分离的一些问题 声明里面我们不带缺省参数&#xff0c;定义我们给缺省参数&#xff0c;如下面两段代码&#xff1a; Data.h#pragma once #include<iostream> using namespace std; class Data { public:Data(int year,int month,int day);private:in…...

postman做接口测试

之前搞自动化接口测试&#xff0c;由于接口的特性&#xff0c;要验证接口返回xml中的数据&#xff0c;所以没找到合适的轮子&#xff0c;就自己用requests造了个轮子&#xff0c;用着也还行&#xff0c;不过就是case管理有些麻烦&#xff0c;近几天又回头看了看postman也可以玩…...

hdlbits系列verilog解答(always块)-29

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 由于数字电路由用网线连接的逻辑门组成,因此任何电路都可以表示为模块和赋值语句的某种组合。然而,有时这不是描述电路的最方便方式。过程procedure(其中 always 的块就是一个示例)提供了描述电路的替代语法…...

uniapp实现瀑布流

首先我们要先了解什么是瀑布流&#xff1a; 瀑布流&#xff08;Waterfall Flow&#xff09;是一种常见的网页布局方式&#xff0c;也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…...

15. 机器学习 - 支持向量机

Hi, 你好。我是茶桁。 逻辑回归预测心脏病 在本节课开始呢&#xff0c;我给大家一份逻辑回归的练习&#xff0c;利用下面这个数据集做了一次逻辑回归预测心脏病的练习。 本次练习的代码在「茶桁的AI秘籍」在Github上的代码库内&#xff0c;数据集的获取在文末。这样做是因为我…...

如何根据进程号查询服务的端口号

ps -ef | grep nacos ps -ef | grep nacos 命令是用于查找系统中所有包含 "nacos" 关键字的进程。这个命令的含义如下&#xff1a; ps: 这是一个用于显示当前正在运行的进程的命令。 -ef: 这两个选项一起使用&#xff0c;表示显示所有进程的详细信息。 -e 选项表示显…...

2.10、自定义量化优化过程

introduction 如何自定义量化优化过程&#xff0c;以及如何手动调用优化过程 code from typing import Callable, Iterableimport torch import torchvision from ppq import QuantizationSettingFactory, TargetPlatform from ppq.api import (ENABLE_CUDA_KERNEL, Quantiz…...

MySQL如何添加自定义函数

深入MySQL&#xff1a;学习如何添加自定义函数 MySQL 是一种流行的开源关系型数据库管理系统&#xff0c;它支持很多内置函数来完成各种操作。不过有时候这些内置函数无法满足我们的需求&#xff0c;这时候就需要自定义函数了。在 MySQL 中&#xff0c;可以通过编写自定义函数…...

超融合数据库:解锁全场景数据价值的钥匙

前言 近日&#xff0c;四维纵横对外官宣已完成上亿元 B 轮融资。作为超融合数据库理念的提出者&#xff0c;三年来 YMatrix 持续在超融合数据库领域中保持精进与迭代&#xff0c;对于超融合数据库在行业、场景中的应用和理解也更为深刻。 本篇文章&#xff0c;我们将基于 YMa…...

Pap.er for Mac:高清壁纸应用打造你的专属视觉盛宴

在浩瀚的互联网海洋中&#xff0c;你是否曾为寻找一张心仪的高清壁纸而烦恼&#xff1f;或者是在大量的壁纸应用中感到困扰&#xff0c;不知道哪一个能满足你的需求&#xff1f;今天&#xff0c;我要向你介绍的&#xff0c;是一款独特的5K高清壁纸应用——Pap.er for Mac。 Pa…...

AI:46-基于深度学习的垃圾邮件识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

【骑行贝丘渔场】一场与海的邂逅,一段难忘的旅程

在这个渐凉的秋日&#xff0c;我们校长骑行队一行人骑着自行车&#xff0c;从大观公园门口出发&#xff0c;开始了一段别开生面的海滩之旅。沿途穿越草海隧道湿地公园、迎海路、海埂公园西门&#xff08;第二集合点&#xff09;、宝丰湿地公园、斗南湿地公园、蓝光城&#xff0…...

消息中间件——RabbitMQ(一)Windows/Linux环境搭建(完整版)

前言 最近在学习消息中间件——RabbitMQ&#xff0c;打算把这个学习过程记录下来。此章主要介绍环境搭建。此次主要是单机搭建&#xff08;条件有限&#xff09;&#xff0c;包括在Windows、Linux环境下的搭建&#xff0c;以及RabbitMQ的监控平台搭建。 环境准备 在搭建Rabb…...

Mysql 表读锁与表写锁

表读锁 加锁&#xff1a;lock table table_name read 释放锁&#xff1a;unlock tables 当事务一用表读锁锁住某张表后&#xff0c; 1.事务一必须释放表读锁才能访问其他表 2.期间事务2可以访问该表&#xff0c;但是修改事会遇到阻塞等待&#xff0c;只有等到事务一释放锁后…...

目标检测概述

1.是什么&#xff1f; 目标检测是计算机视觉领域的核心问题之一&#xff0c;其任务就是找出图像中所有感兴趣的目标&#xff0c;确定他们的类别和位置。由于各类不同物体有不同的外观&#xff0c;姿态&#xff0c;以及不同程度的遮挡&#xff0c;加上成像是光照等因素的干扰&a…...

10月31日星期二今日早报简报微语报早读

10月31日星期二&#xff0c;农历九月十七&#xff0c;早报微语早读分享。 1、广西官宣&#xff1a;做试管婴儿费用可报销&#xff1b; 2、港媒&#xff1a;4名港大学生承认“煽惑他人蓄意伤人罪”&#xff0c;被判监禁2年&#xff1b; 3、331名中国维和官兵全部获联合国勋章…...

【Linux】虚拟机项目部署与发布

目录 一、Linux部署单机项目 1.1 优缺点 1.2 将项目共享到虚拟机 1.3 解压后将war包放入tomcat 1.4 数据库导入脚本 1.5 Tomcat启动项目 二、部署前后端分离项目 2.1 准备工作 2.2 部署SPA项目 2.2.1 nginx反向代理 2.2.2 SPA项目宿主机访问 一、Linux部署单机项目…...

边缘计算技术的崭新篇章:赋能未来智能系统

边缘计算是近年来云计算和物联网技术发展的重要趋势。通过将数据处理和分析从云端迁移到设备边缘&#xff0c;边缘计算能够实现更低的延迟和更高的数据安全。本文将探索边缘计算技术的最新进展及其在不同行业中的应用场景。 1. 实时数据处理与决策 在需要快速响应的场景中&…...

Mac/Linux类虚拟机_CrossOver虚拟机CrossOver 23.6正式发布2024全新功能解析

CodeWeivers 公司于今年 10 月发布了 CrossOver 23.6 测试版&#xff0c;重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿&#xff0c;表示正式发布 CrossOver 23 稳定版&#xff0c;在诸多新增功能中&#xff0c;最…...

RabbitMQ 运维 扩展

1、集群管理与配置 1.1、集群搭建 关于Rabbitmq 集群的搭建&#xff0c;详见以下文章。简单说来就是将多个单机rabbitmq服务&#xff0c;通过给到一致的密钥&#xff08;.erlang.cookie&#xff09;并且开放rabbitmq服务的 25672 端口&#xff0c;允许多节点间进行互相通讯&am…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

组合模式:构建树形结构的艺术

引言:处理复杂对象结构的挑战 在软件开发中,我们常遇到需要处理部分-整体层次结构的场景: 文件系统中的文件与文件夹GUI中的容器与组件组织结构中的部门与员工菜单系统中的子菜单与菜单项组合模式正是为解决这类问题而生的设计模式。它允许我们将对象组合成树形结构来表示&…...

大模型的LoRa通讯详解与实现教程

一、LoRa通讯技术概述 LoRa(Long Range)是一种低功耗广域网(LPWAN)通信技术,由Semtech公司开发,特别适合于物联网设备的长距离、低功耗通信需求。LoRa技术基于扩频调制技术,能够在保持低功耗的同时实现数公里甚至数十公里的通信距离。 LoRa的主要特点 长距离通信:在城…...

CSS(2)

文章目录 Emmet语法快速生成HTML结构语法 Snipaste快速生成CSS样式语法快速格式化代码 快捷键&#xff08;VScode&#xff09;CSS 的复合选择器什么是复合选择器交集选择器后代选择器(重要)子选择器(重要&#xff09;并集选择器(重要&#xff09;**链接伪类选择器**focus伪类选…...