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

news2024/11/19 17:51:50

 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.cpp



void 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();

赋值运算符重载

如下,d1的日期为非法日期,d3为合法日期,我把d3的日期赋值给d1,让d1也成为合法日期:

Data d1(2003,11,33);
Data d3(2003,11,30);
	d1 = d3;
	d3.print();
	d1.print();

但是两个类之家是不能之间进行赋值的,这个可以运行是因为编译器默认生成了运算符重载,将d3的成员变量的值逐个复制给d1的成员变量。需要注意的是,当类中存在指针类型的成员变量时,使用默认的赋值运算符重载函数可能会导致浅拷贝问题。在这种情况下,你需要自己编写赋值运算符重载函数,以确保进行深拷贝操作,避免出现内存错误。

我们自己可以写一下赋值运算符重载:

 赋值运算符重载和拷贝构造区别

内置类型我们可以像这样进行赋值:它的原理实际上是这样:注意:优先级问题,还需要再加个括号:但是自定义类型就不可以了:

那我们可以按照内置类型的思路:先让d4复制给d3,再返回一个值,把这个值再赋值给d1.

返回的这个值也要是Data类型,因为要返回一个日期,把这个日期再赋值给d1. 

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

解析:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1149934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础入门例程21-NP21 增加派对名单(二)(列表)

本专栏&#xff1a; Python365基础入门例程 作者&#xff1a;heda3 最近的博文&#xff1a; 1、Python基础入门例程19-NP19 列表的长度&#xff08;列表&#xff09;-CSDN博客 2、Python基础入门例程18-NP18 生成数字列表&#xff08;列表&#xff09;-CSDN博客 3、Pyth…

spring boot配置ssl(多cer格式)保姆级教程

1. 准备cer格式的证书&#xff1b; 2. 合并cer证书并转化成jks格式的证书 为啥有这一步&#xff0c;因为cer证书配置在spring boot项目中&#xff0c;项目启动不起来。如果有大佬想指导一下可以给我留言&#xff0c;在此先谢过大佬。 1&#xff09;先创建一个jks格式的证…

【教学类-19-04】202310《ABAB式-规律排序涂色-A4竖版2份》(中班)

展示效果&#xff1a; 单人使用样式&#xff1a; 单页打印样式 ​ 打印效果&#xff1a; 背景需求&#xff1a; 中班幼儿需要掌握ABAB规律排序&#xff0c;如下图所示&#xff0c;AB两个元素能外形不同、颜色不同。 2022年11月带领中3班&#xff08;现大3班&#xff09;幼…

maven子模块无法导入jar包问题

明明本地仓库有jar包 maven子模块无法导入jar包&#xff0c;然后放到父项目的pom.xml则可以导入 可以试试更新仓库后&#xff0c;引入成功

这款制作电子画册的网站,好用到爆

要是早点发现这款制作电子画册网站该多好啊&#xff01;由于缺乏相关知识和技能&#xff0c;一直没有找到合适的平台。直到最近&#xff0c;偶然发现了这个网站&#xff0c;才发现原来制作电子杂志如此简单 这个网站就是FLBOOK在线制作电子画册平台&#xff0c;它不仅提供了丰富…

PicoDiagnostics (NVH设备软件)-NVH软件计算原理探究

NVH 问题探讨 PicoDiagnostics (NVH设备软件)对于不同驱动方式的车辆、是否通过OBD口读取转速和速度&#xff0c;后轮差速传动比数值对其频率计算原理也是有影响的。究竟什么时候需要填后轮差速传动比呢&#xff1f;下面做一些探讨&#xff1a; 连接OBD诊断口计算速度&频率…

用思维导图成为职业规划达人

今天&#xff0c;我们来聊聊如何用思维导图来做职业规划&#xff1f;在外面进行职业规划的时候&#xff0c;常常包括以下几项自我认知以及定位、职位的要求以及自身与职位之间的匹配程度。 今天我们就用 在线制图工具ProcessOn&#xff0c;来制作这一份职业规划。 自我分析 …

国标发布|法大大参编《第三方电子合同服务平台信息安全技术要求》

2023年9月7日&#xff0c;国家市场监督管理总局联合国家标准化管理委员会&#xff0c;在全国标准信息公共服务平台发布了国家标准《第三方电子合同服务平台信息安全技术要求》&#xff0c;法大大作为主要起草单位、法大大联合创始人兼首席法务官梅臻担任主要起草人参与其中。 &…

基于STC系列单片机实现定时器0扫描数码管显示定时器/计数器1作为计数器1产生频率的功能

#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint #define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚 #define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚 sbit LED P1^0;//位定义…

云端服务器和本地服务器的区别

随着云计算技术的快速发展&#xff0c;云端服务器已经成为越来越多企业和个人的首选。相较于传统的本 地服务器&#xff0c;云端服务器有着许多不同之处。那么&#xff0c;它们之间到底有哪些区别呢? 1. 部署位置 本地服务器通常部署在用户所在的物理场所&#xff0c;例如公…

c语言基础:L1-063 吃鱼还是吃肉

国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤&#xff1b;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重&#xff0c;给出补充营养的建议。 输入格式&#xff1a; 输入在第一行给出一个不超过 10 的正整数 N&am…

MySQL扩展语句和约束方式

一、扩展语句 复制&#xff0c;通过like这个语法直接复制bbb的表结构。只是复制表结构&#xff0c;不能复制表里面的数据 把bbb表里面的数据&#xff0c;复制到test&#xff0c;两个表数据结构要一致 创建一张表&#xff0c;test1,数据从bbb来&#xff0c;表结构也是bbb delete…

自动化测试框架之RobotFramework关键字编写

众所周知RobotFramework是关键字驱动&#xff0c;那么关键字的编写在RobotFramework 测试框架进行自动化测试时就非常关键了。如何编写关键字呢&#xff0c;在上节课的基础上&#xff0c;封装post request 请求为关键字&#xff0c;如下 在项目的基础上右键 new----》Robot Re…

笔记软件Notability mac中文版软件功能

Notability mac是一款帮助用户备注文件的得力工具&#xff0c;Notability Mac版可用于注释文稿、草拟想法、录制演讲、记录备注等。它将键入、手写、录音和照片结合在一起&#xff0c;便于您根据需要创建相应的备注。 Mac Notability mac中文版软件功能 将手写&#xff0c;照片…

解锁高效创作艺术!AI助力文章生成与精美插图搭配完美融合

在当今这个信息爆炸的时代&#xff0c;高效创作文章已经成为了一种必备的技能。然而&#xff0c;创作一篇高质量的文章并插入精美插图&#xff0c;往往需要耗费大量的时间和精力。现在&#xff0c;随着AI技术的发展&#xff0c;我们迎来了一个全新的文章创作时代——利用AI高效…

UI自动化概念+Web自动化测试框架

1.UI自动化测试概念:我们先明确什么是UI UI&#xff0c;即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试&#xff0c;UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …

【LVS实战】01 LVS介绍

一、LVS是什么 LVS&#xff08;Linux Virtual Server&#xff09;&#xff0c;是一个极好的负载均衡解决方案&#xff0c;它将一个真实服务器集群虚拟成一台服务器来对外提供服务&#xff0c;同时在真实服务器集群中实现了负载均衡。该技术由章文嵩博客发起&#xff0c;从linu…

无公网IP,如何使用公网SSH远程访问家中的树莓派?

文章目录 前言如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar内网穿透4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址…

Android NDK开发详解之ndk-build 脚本

Android NDK开发详解之ndk-build 脚本 内部原理从命令行调用选项可调试 build 与发布 build要求 ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。我们针对 ndk-build 使用的 Android.mk 和 Application.mk 配置提供了更具体的文档。 内部原理 运行 ndk-build 脚本相…

联想电脑怎么录屏?两个实用方法,快速搞定

“联想电脑怎么录屏呀&#xff1f;刚买的联想电脑&#xff0c;本来打算用来直播&#xff0c;但是现在发现不会录屏&#xff0c;上网查了很久也没有解决方法&#xff0c;真的很头疼&#xff0c;希望大家帮帮我&#xff01;” 联想是世界知名的电子产品制造商之一&#xff0c;它…