C++: 类和对象(下)

目录

一、日期类

二、初始化列表

三、static成员

四、友元

五、内部类


一、日期类

日期类主要用于深化对六大默认成员函数和运算符重载的理解

日期类需要实现方法有:

1.构造函数

2.拷贝构造函数

3.赋值运算符重载

4.==运算符重载

5.!=运算符重载

6.+运算符重载(主要是+天数)、+=运算符重载

7.-运算符重载(主要是-天数)、-=运算符重载

8.前置++运算符重载、后置++运算符重载

9.前置--运算符重载、后置--运算符重载

10.>运算符重载

11.<运算符重载

12.>= 、<=运算符重载

13.日期-日期  (返回天数)

14.析构函数

// 获取某年某月的天数
int Date::GetMonthDay(int year, int month)
{int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month==2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return arr[month];
}// 全缺省的构造函数
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}// 拷贝构造函数
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}//赋值运算符重载Date& Date::operator=(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;return *this;
}// 析构函数Date::~Date(){_year = _month = _day = 0;}// 日期+=天数Date& Date::operator+=(int day){if (day < 0)return *this -= day;_day += day;while (_day > GetMonthDay(_year, _month)){if (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);_month++;}if (_month > 12){_year++;_month = 1;}}return *this;}// 日期+天数Date Date::operator+(int day){Date d(*this);d._day += day;while (d._day > GetMonthDay(d._year, d._month)){d._day -= GetMonthDay(d._year, d._month);d._month++;if (d._month > 12){d._year++;d._month = 1;}}return d;}// 日期-天数Date Date::operator-(int day){Date d(*this);d._day -= day;while (d._day <  0 ){if (d._day < 0){d._month--;d._day += GetMonthDay(d._year, d._month);}if (d._month < 1){d._year--;d._month = 12;}}return d;}// 日期-=天数Date& Date::operator-=(int day){if (day < 0)return *this += day;_day -= day;while (_day < 0){if (_day < 0){_month--;_day += GetMonthDay(_year, _month);}if (_month < 1){_year--;_month = 12;}}return *this;}// 前置++Date& Date::operator++(){*this += 1;return *this;}// 后置++Date Date::operator++(int){Date d(*this);*this += 1;return d;}//后置--Date Date::operator--(int){Date d(*this);*this -= 1;return d;}// 前置--Date& Date::operator--(){*this -= 1;return *this;}// >运算符重载bool Date::operator>(const Date& d){return (_year > d._year)|| (_year==d._year&&_month > d._month)|| (_year == d._year && _month == d._month && _day > d._day);}// ==运算符重载bool Date::operator==(const Date& d){return (_year == d._year) && (_month == d._month) && (_day == d._day);}// <运算符重载bool Date::operator < (const Date& d){return (_year < d._year)|| (_year == d._year && _month < d._month)|| (_year == d._year && _month == d._month && _day < d._day);}// >=运算符重载bool Date::operator >= (const Date& d){return !(Date::operator < (d));}// <=运算符重载bool Date::operator <= (const Date& d){return !(Date::operator > (d));}// !=运算符重载bool Date::operator != (const Date& d){return !(Date::operator == (d));}// 日期-日期 返回天数int Date::operator-(const Date& d){int flag = 1;Date max = *this;Date min = d;int n = 0;if (*this < d){max = d;min = *this;flag = -1;}while (max != min){++min;++n;}return n*flag;}void Date::Print()const{cout << _year << "年" << _month << "月" << _day << "日" << endl;}

  写完之后的体会:逻辑可能会有一些坑,要仔细想一想,保证完备性。否则会出各种各样的错误。最后一个计算日期之间相减的方法,我用了日期的前置++,调用了前置++的方法,前置++里面,又调用了+=的运算符重载,在+=这个方法里,我写了日期相加天数以后,超过本月天数和超过12个月的预防措施。因此不用担心日期相减和相加再出差错。最后一个日期相减的方法确实不容易想到,其他的都太繁琐了,这种方法比较简洁明了。

二、初始化列表

之前说了类里面有6个默认成员函数,其中构造函数和拷贝构造函数都可以在建立对象的时候就给对象赋值。虽然构造函数只能调用一次,但在这个函数里面,可以无数次给成员赋值。因此不叫初始化。

所谓初始化,是只能进行一次的。

虽然在构造函数里面也要进行赋值,但不管怎么样,类的成员都会走这个初始化列表,所以建议还是在初始化列表赋初始值。

class Date
{
public:Date(int year, int month, int day):_year(year)      //初始化年,_month(month)    //初始化月,_day(day)        //初始化天{ }private:int _year =1900;int _month = 1;int _day = 1;
};

初始化列表的规则:

1.初始化列表的初始化顺序,是按照下面成员变量声明的顺序进行的,不是按照列表写在前后的顺序。

2.如果给了缺省值,又传了参数,那就用参数初始化,如果没给参数,那就用缺省值初始化。如果都没给,那就给随机值。

3.特别说明:const 修饰成员变量、引用的成员变量、自定义类型的成员(并且该类没有默认构造函数时)必须进行初始化。

int整型可以给自定义类型对象赋值,此时,int整型会通过拷贝构造给一个临时的对象,然后由这个临时对象给自定义类型对象赋值。如果加个explicit 关键词,就可以禁用构造函数的隐式转换。

三、static成员

static 修饰的成员变量叫静态成员变量,static修饰的成员函数,叫做静态成员函数。

1.static修饰的成员变量,不仅仅属于某一个对象,属于整个类,属于所有被类创建的对象。它可以通过类名访问,也可以通过某个对象访问。它的值会保存,随程序结束而销毁。

2.static修饰的成员变量,它不能在类中给缺省值。因为缺省值是给函数使用的,而且是this指针的函数。static属于类,它没有this指针。

3.static修饰的成员变量的定义,必须在类外。

4.静态成员也是类的成员,受public、private和protected访问限定符的影响。

static修饰的成员函数:

static修饰的成员函数,是专为static修饰的成员变量而生的,它只能访问static修饰的成员变量。不能访问非静态的成员变量。静态成员函数没有this指针。

class Date
{
public:
static int Getcount()//static修饰,返回int类型
{return count;//获取静态成员变量的值
}private:static int count; //声明static成员变量
};int Date::count = 0;//定义static成员变量

四、友元

前面介绍过友元。

在类中加上friend关键字,后面跟要声明的函数/类。就可以了。

这么写之后,该函数就是该类的朋友,函数可以使用类的成员(包括对象和函数),但是朋友是单向的,不是双向的。

一个函数可以是多个类的友元函数。

友元函数不能用const修饰。

友元类:

在Time类中,写了Date类的声明。Date类中没写Time类的友元声明。

则Time类的成员Date都可以访问,但Date类的成员,Time不能随意访问。

五、内部类

内部类是定义在类中的类。

内部类是外部类的友元。

内部类可以随意访问外部类的成员,但外部类不能随意访问内部类的成员。

sizeof(外部类)=外部类的大小,和内部类大小没有关系。

最后再强调一遍,类型是不会分配内存的。用类型实例化以后有了对象才会分配内存。

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

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

相关文章

基于springboot实现中小型医院网站管理系统【项目源码+论文说明】

基于springboot实现中小型医院网站管理系统演示 摘要 本基于Spring Boot的中小型医院网站设计目标是实现用户网络预约挂号的功能&#xff0c;同时提高医院管理效率&#xff0c;更好的为广大用户服务。 本文重点阐述了中小型医院网站的开发过程&#xff0c;以实际运用为开发背…

【嵌入式】让人又爱又恨的“指针”

调试bug遇到了野指针&#xff0c;无语凝噎&#xff0c;记录 【嵌入式】让人又爱又恨的“指针” 1.我到底是个啥&#xff1f;1.1【解释一下】1.2【谨慎使用】 2.毒舌“野指针” 1.我到底是个啥&#xff1f; 1.1【解释一下】 回顾一下&#xff0c; 什么是指针&#xff1f;指针在…

自定义注解加反射实现数据类型转换

概述 通过ORM框架从数据库中查询出的实体对象&#xff0c;大部分情况下可能与前端页面展示的数据结果类型略有不同&#xff0c;比如&#xff1a;后端定义的店铺实体类(Shop)中有店铺状态:0-正常&#xff0c;1-未审核&#xff0c;2-违规&#xff0c;3-倒闭,在做脱敏的处理下需要…

[amateurs CTF 2024] crypto/pilfer-techies

这题费了几天,昨天写到11点半才基本完成程序,需要交互2000多,远程太慢了交互两次就断掉了&#xff0c;反正本地能成&#xff0c;程序逻辑上正确了。小鸡块也写了WP了等写完马上去看小鸡块神的思路。也许有的问题很大呢&#xff1f; 先简单看下题&#xff1a; #!/usr/local/bi…

二分查找基本模版

二分&#xff1a;通过不断取中点&#xff0c;重复将一个区域一份为二&#xff0c;使其不断缩小范围直至找到答案 本质&#xff1a;性质/边界&#xff0c;而不是单调性 时间复杂度&#xff1a;O(logN) 代码模版&#xff1a; //找到的是最左侧的数值点 while(l < r){ //尽…

[数据结构]——二叉树——堆的实现

1. 堆的概念及结构 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a; < 且 < ( > 且 > ) i 0&#xff0c;1&…

前端面试题(1)

1&#xff0c;CSS盒子模型 CSS的盒模型有两种&#xff1a;标准盒模型&#xff0c;IE盒模型。IE盒模型&#xff0c;其中content包含了内边距padding和边框border。盒子的实际宽度 contentmargin。标准盒模型&#xff0c;盒子的实际宽度 content(内容)padding(内边距)border(边…

rocky9 yum 安装与配置MySQL8

1.前置条件&#xff1a; 把yum包更新到最新 [rootlocalhost ~]# yum update 查看系统中是否已安装 MySQL 服务 rpm -qa|grep mysql 如果有安装mysql,则需要先卸载之前安装的mysql&#xff1a;yum -y remove mysql 然后再查看mysql是否都卸载完成,如果还有没卸载完成的&am…

小程序开发SSL证书下载和安装

在开发小程序时&#xff0c;确保数据的安全传输至关重要&#xff0c;而实现这一目标的关键在于正确获取与安装SSL证书。以下详细介绍了从获取到安装SSL证书的完整流程&#xff0c;以助您为小程序构建可靠的加密通信环境。 一、小程序SSL证书类型选择&#xff1a; 域名验证型D…

创新指南|全球需求低迷中国企业出海趋势洞察和创新机会

对于企业出海来说&#xff0c;第一步判断趋势非常重要&#xff0c;这甚至事关企业生死。比如十年前的2014年&#xff0c;中国最大的两家电商平台阿里和京东成功IPO&#xff08;上市&#xff09;后&#xff0c;认为接下来最大的机会在于中国市场的消费升级。与阿里、京东不同&am…

TypeScript基础语法

这里写自定义目录标题 变量条件控制循环函数类和接口模块开发 变量 TypeScript在JavaScript的基础上加入了静态类型检查功能&#xff0c;因此每一个变量都有固定的数据类型。 let msg: string hello worldlet 声明变量的关键字&#xff0c; const 则代表常量 msg 变量名称 &…

Linux:软件包管理器 - yum

Linux&#xff1a;软件包管理器 - yum Linux的软件安装方式源代码安装rpm包安装yum安装 yum三板斧yum listyum installyum remove yum生态yum源 Linux的软件安装方式 源代码安装 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序 源代码安…

git知识

如何将develop分支合并到master分支 #简单版 git checkout master git pull origin master git merge origin/develop # 解决可能的冲突并提交 git push origin master#复杂版 git checkout master # 拉取远程 master 分支的最新代码并合并到本地 git pull origin master # 拉…

新时代·高质量·硬道理丨开放的大门越开越大、开放的水平越来越高

新时代下&#xff0c;中国坚定不移地实施扩大高水平对外开放战略&#xff0c;致力于构建更高层次、更宽领域的开放型经济体系。以下是对新时代高质量硬道理这一主题下&#xff0c;中国开放大门越开越大、开放水平越来越高的几个关键点分析&#xff1a; 全方位开放格局 政府工…

YOLOv8打印模型结构配置信息并查看网络模型详细参数:参数量、计算量(GFLOPS)

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

计算机基础知识-第7章-程序的本质(2)——算法与数据结构概论

一、算法数据结构程序 提出这一公式并以此作为其一本专著的书名的瑞士计算机科学家尼克劳斯沃思&#xff08;Niklaus Wirth&#xff09;由于发明了多种影响深远的程序设计语言&#xff0c;并提出结构化程序设计这一革命性概念而获得了1984年的图灵奖。他是至今惟一获此殊荣的瑞…

Java——测试相关

1、测试的常用方法 单元测试&#xff1a;针对软件中最小可测试单元进行的测试&#xff0c;如类、方法等。功能测试&#xff1a;检查软件的各项功能是否按照需求规格书执行&#xff0c;通常包括正常功能、边界情况和异常情况的测试。性能测试&#xff1a;检查软件的速度、响应时…

【Linux杂货铺】文件系统

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 硬盘 &#x1f4c2; 物理结构 &#x1f4c2; 存储结构 &#x1f4c2; CHS定址法 &#x1f4c2; 操作系统对硬盘的管理和抽象 &#x1f4c1; 文件系统 &#x1f4c2; 分区 &#x1f4c2; 分组 &#x1f4c2; inode号 分配…

1113. 红与黑--Flood Fill 算法

目录 1113. 红与黑--Flood Fill 算法---宽搜&#xff08;BFS&#xff09; 输入格式 输出格式 数据范围 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 1113. 红与黑--Flood Fill 算法---宽搜&#xff08;BFS&am…

无人机技术在光伏电站勘探中的重要应用

随着科技的不断进步和创新&#xff0c;无人机技术在各个领域中都发挥着越来越重要的作用。其中&#xff0c;光伏电站对于无人机的应用也成为了行业内的高效运维方式之一&#xff0c;凭借无人机卓越的性能和可靠性&#xff0c;有效的减少了人力运维的危险性和延迟性&#xff0c;…