C++初阶 类和对象(下)

这篇具有很好参考价值的文章主要介绍了C++初阶 类和对象(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、拷贝构造函数

1.1 什么是拷贝构造函数?

1.2 为什么得是引用?

1.3 使用拷贝构造函数

1.4 拷贝构造函数有什么用?

二、运算符重载

2.1 什么是运算符重载?

2.2  尝试前须知

2.3 常见运算符重载

2.3.1+=运算符重载

2.3.2+运算符重载

2.3.3前置++和后置++运算符重载

三、下期预告


前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

一、拷贝构造函数

1.1 什么是拷贝构造函数?

拷贝构造函数是构造函数的重构,也就是说它也没有需要返回的东西,同样是为了构造成员而生。

拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

1.2 为什么得是引用?

为什么这个形参得是被类对象的引用呢,我直接传递我这个要拷贝的目标不可以吗,不是一样的操作吗。有如下代码就完美的符合你的想法

#include<iostream>
using namespace std;
class Date
{
public:

	Date(int year = 1,int month=1,int day=1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	Date(Date date)
	{
		_year = date._year;
		_month = date._month;
		_day = date._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{

}

现在的编译器很智能,直接就阻止了你的无穷递归行为,为什么会发生无穷递归呢。

这样说吧,假设你有一个Date d和你个test函数,你想将d传递给test函数,于是编译器就会调用这个拷贝构造函数,而调用这个拷贝构造函数的时候你会生成一个叫做date的形参,而这个形参刚好也是Date类型的变量,那么它也会走向这个拷贝构造函数,于是拷贝构造函数调用拷贝构造函数,再调用拷贝构造函数.......

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

1.3 使用拷贝构造函数

简单的拷贝并打印一下,代码什么的自己去敲一遍效果好一些,别光看,至于为什么要加const是因为我们传递过去的变量是被拷贝的,是不会被修改的   加个const是为了避免一些低级错误的发生,比方说修改到了被拷贝的对象,同时增加了代码的可读性。

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

1.4 拷贝构造函数有什么用?

学到这里,大家恐怕也是明白了,拷贝构造函数就是简单地将目标内容拷贝给新定义的对象罢了, 那么它有用吗,这是很多初学者的疑惑,实际上它不仅仅是有用,它是很有用。

比方说,我们现在实现的日期类的拷贝构造函数,其实只是涉及到了一个简单的值拷贝,而到后期我们使用什么栈啊,堆啊,二叉树之类的东西,我们如果还是简单地进行值拷贝,我们拷贝的东西不就只有一具空壳吗,我们得采取一些方式实现深拷贝,也就是把栈里面的值都给拷贝出来的那种拷贝,如此才可以保证这两个东西一模一样,才能够达到预期的效果。

二、运算符重载

2.1 什么是运算符重载?

其实很多小伙伴应该在使用C语言的时候就有过这样的苦恼,我这结构体+结构体没法玩啊,我得用.或->获取结构体成员才能够对里面的成员进行操作啊,太费劲了,就是写了个函数,还得来个d3=addition(d1,d2);就不能d1+d2吗    在C++中,是可以实现的,这个操作就叫做运算符重载,也就是对运算符进行补充定义。

2.2  尝试前须知

operator用在运算符重载上,比方说+运算符的重载,在进行重载部分的书写时,我们就得在之前加上operator,大概可以用这个公式阐述:返回类型+operator+重载的运算符(参数)

运算符重载既可以写在类的里面,也可以写在类的外面    而写在类的外面我们往往会用到一个操作叫友元,这个操作的大致意思就是令你这个在类外面的东西成为我这个类的朋友,因此你这个类外面的东西就可以访问到类中private中的内容,对于友元这里不再赘述,之后会进行讲解。

有的小伙伴又会有些问题,那么我们直接把private去掉,或者不在private中定义成员变量。我想说的是,这样多少有点舍本逐末了,因为在C++中之所以会有类的原因,有一部分就是因为多个结构体的函数和变量过于混乱,而按你的方法去做,那么这个类的成员变量所有人都可以进行操作,那哪还有什么规矩,这个类的创建又有什么意义?

因此,博主在进行运算符重载的时候使用的方法是在类中进行运算符重载,这样既可以访问到私有的成员变量,还可以保证代码的严谨性。

注意:
1.不能通过连接其他符号来创建新的操作符:比如operator@ 
2.重载操作符必须有一个类类型参数
3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐
藏的this
5. .*   ::    sizeof    ?:    . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。这5个死记硬背记住就ok了。

2.3 常见运算符重载

2.3.1+=运算符重载

目标:实现一个日期+天数,日期被修改为过了多少天的日期

很多人第一次写会写成这样,而编译器报错是因为多了一个this指针过去,已经达到了三目运算符的操作了   因此我们只需要把Date d1去掉即可,但因为有this指针的存在,我们一样能对这个变量进行操作。

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

实现这个之前我们可以写一个GetMonthDay函数来获得没一月份的天数,值得注意的一点是闰年时2月为29日,接着我们来讲讲实现思路,我们的返回值最好设置成Date&型的,因为+=操作的目标出了函数作用域在main中依然存在,因此使用Date&类型的返回值可以令编译器的效率得到提高。

可以先在目标的_day上加上day,这样能方便之后的进位,比方说2023-11-16 +100就先处理成2023-11-116,之后通过GetMonthDay取得的具体进位数据来进行进位即可,这里就可以通过循环实现,当_day>GetMonthDay时意味着需要进位,因此可以以这个来作为循环是否继续的条件,之后的实现便只需要注意一些细节即可,比方说,月满12进1之类的。

	int GetMonthDay(int year, int month)
	{
		int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		//之所以是13是为了更加符合日期的返回,一月就返回数组下标为1的值
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
		{
			return 29;
		}
		return arr[month];
	}
	Date& operator +=(int day)
	{
		_day += day;
		while (_day > GetMonthDay(_year,_month))
		{
			_day -= GetMonthDay(_year, _month);
			_month++;
			if (_month>12)
			{
				_month = 1;
				_year++;
			}
		}
		return *this;
	}

测试:

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

2.3.2+运算符重载

有了+=运算符之后+运算符就很好操作了,复用一下就好 

使用临时变量的原因是因为,+运算符并不改变原来变量的值,比方说a=b+100;这里的b也不会被修改

	Date operator+(int day)
	{
		Date tmp = *this;
		tmp += day;
		return tmp;
	}

2.3.3前置++和后置++运算符重载

在C++中前置++和后置++如果我们要对它进行重载,你就会惊讶的发现,它们两的运算符名字其实是一模一样的,这怎么进行区分呢,祖师爷其实也没有太好的办法,他对这个地方做了特殊化处理,就像我们做oj题时遇到的特殊情况,单独处理一样。祖师爷也是这么做的,他规定前置++和后置++的区别就在于,后置++的参数有个int型的

什么意思?差不多是这样,operator++(),operator++(int)前面的就代表着前置++,后面的那个就代表着后置++,那为什么是int,不能是float吗。我只能这么说,这是巧合,祖师爷就想拿int来区分,仅此而已。

有了+和+=实现起来就直接复用就好了

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

C++初阶 类和对象(下),C++初阶,c++,算法,开发语言

三、下期预告

大概在明天,博主会来一篇日期类实现详解,那里面会讲到友元操作,期待你的到来QAQ 文章来源地址https://www.toymoban.com/news/detail-754472.html

到了这里,关于C++初阶 类和对象(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】类和对象(一)

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C++学习 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【C++】C++入门(一):命名空间C++的输入输出缺省参数函数重载 C语言是面向过程的,关注的是过程,分析求解问题的步骤,通过

    2024年02月01日
    浏览(36)
  • 【C++初阶】类和对象(下)

      构造函数其实分为:     1.函数体赋值     2.初始化列表 之前所讲到的构造函数其实都是函数体赋值,那么本篇文章将会具体讲述初始化列表。 语法 以 一个冒号开始 ,接着是 一个以逗号分隔 的数据成员列表,每个\\\"成员变量\\\"后面跟 一个放在括号中的初始值或表达式。

    2024年02月05日
    浏览(43)
  • C++初阶 - 3.类和对象(中)

    目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载  5.2 赋值运算符重载 5.3 前置++和后置++重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 如果一个类中什么成员都有,

    2024年02月16日
    浏览(40)
  • C++学习之路(C++初阶)——类和对象(上)

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : C++初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言       🛰️友友们的支持是本博主更新的动力   本博客主要为学习C++类和对象内容做准备,开头补充

    2024年02月07日
    浏览(58)
  • 【C++初阶】第三站:类和对象(中) -- 日期计算器

    目录 前言 日期类的声明.h 日期类的实现.cpp 获取某年某月的天数 全缺省的构造函数 拷贝构造函数 打印函数 日期 += 天数 日期 + 天数 日期 -= 天数 日期 - 天数 前置++ 后置 ++ 前置 -- 后置-- 日期类中比较运算符的重载 运算符重载 ==运算符重载 != 运算符重载 =运算符重载 运算符

    2024年02月19日
    浏览(44)
  • 【C++初阶】类和对象——构造函数&&析构函数&&拷贝构造函数

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++头疼记 ========================================================================= 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构

    2024年02月06日
    浏览(56)
  • 【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数

    目录 前言 类的6个默认成员函数 构造函数 概念 特性 析构函数  概念 特性 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类成员函数 取地址及const取地址操作符重载 本章总结:         有时候我们写好了一个栈,头脑中第一件事

    2024年02月20日
    浏览(44)
  • 【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】五、类和对象 (日期类的完善、流运算符重载函数、const成员、“”取地址运算符重

    2024年02月05日
    浏览(44)
  • 【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】三、类和对象 (面向过程、class类、类的访问限定符和封装、类的实例化、类对象模

    2024年02月05日
    浏览(60)
  • 【C++初阶】类和对象——操作符重载&&const成员函数&&取地址重载&&日期类的实现

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++头疼记 ========================================================================= 目录   前言: 运算符重载 运算符重载  赋值运算符重载 前置++和后置++重载 const成员 取地址及cons

    2024年02月06日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包