C++类与对象(二):六个默认构造函数(二)

在上篇提到了构造函数、拷贝构造函数、析构函数,这篇将会分享剩下默认构造函数:赋值运算符重载、运算符重载。当学习了这些构造函数可以实现一个日期类。

目录

运算符重载

赋值运算符重载

前置++

后置++


运算符重载

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)

注意:

1.不能通过连接其他符号来创建新的操作符:比如operator@

2.重载操作符必须有一个类类型参数

3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义

4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this

  1. .* :: sizeof ?: . 注意以上5个运算符不能重载。

赋值运算符重载

对内置类型进行赋值,不需要重载,直接使用编译器自动生成的,但是对于自定义类型却不行,这时候就需要自己写一个赋值运算符重载。

赋值运算符重载格式

1.参数类型:const T&,传递引用可以提高传参效率

2.返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值

3.检测是否自己给自己赋值

4.返回*this :要复合连续赋值的含义

代码示例:

cpp 复制代码
class Date {
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	//赋值运算符重载
	/*Date& operator=(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}*/
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2025,5, 21);
	Date d2(2,2,2);
	d2 = d1;
	d2.Print();
	return 0;
}

运行结果:

用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

注 意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值,并且赋值运算符只能重载成类的成员函数不能重载成全局函数。

前置++

对于日期类前置++需要注意什么呢,前置++返回的是算完后的值。

前置++重载格式:Date& operator++()

代码示例:

cpp 复制代码
class Date {
public:
	Date(int year = 2025, int month = 5, int day = 21)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
	Date& operator++()//前置++
	{
		_day += 1;
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};

注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率。

后置++

如何区分前置++和后置++呢?为了区分前置++和后置++,C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器 自动传递。

代码示例:

cpp 复制代码
class Date {
public:
	Date(int year = 2025, int month = 5, int day = 21)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
	Date& operator++()//前置++
	{
		_day += 1;
		return *this;
	}

	Date operator++(int)
	{
		Date tmp(*this);
		_day += 1;
		return tmp;
	}
private:
	int _year;
	int _month;
	int _day;
};

因为是后置++,所以需要一个临时变量来存储*this,返回++之前的值。

相关推荐
AI科技星1 分钟前
基于空间光速螺旋第一性原理的电荷本源定义与电场时空协变方程的完整推导、严格证明及全尺度数值验证
c语言·开发语言·算法·机器学习·数据挖掘
马猴烧酒.4 分钟前
【Java复习|Lambda表达式】Java Lambda 表达式、函数式接口与匿名内部类:从起源到原理
java·开发语言·ide·笔记·python·spring
fengfuyao9858 分钟前
C# 高仿QQ截图工具(支持自定义快捷键)
开发语言·c#
2401_8579182910 分钟前
C++与自动驾驶系统
开发语言·c++·算法
liu****21 分钟前
linux上git推送内容到gitee上
c++·git·gitee·版本控制
GfovikS0610022 分钟前
C++中的函数式编程
开发语言·c++·算法
2401_8579182922 分钟前
C++中的构建器模式
开发语言·c++·算法
酉鬼女又兒24 分钟前
零基础快速入门前端JavaScript Array 常用方法详解与实战(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·chrome·蓝桥杯
liu****25 分钟前
6.多人协作(同一分支下(不常用))(一)
c++·gitee·版本控制
小罗和阿泽28 分钟前
GUI 自动化测试 pywinauto测试框架
开发语言·python·功能测试·测试工具·pytest