文章目录
- 前言
- 一、运算符重载
- 二、赋值运算符重载
- 1. 赋值运算符重载格式:
- 2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。
- 3. 赋值运算符只能重载成类的成员函数不能重载成全局函数
- 三、前置++与后置++
前言
`
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
一、运算符重载
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
注意:
1…不能通过连接其他符号来创建新的操作符:比如operator@
2.重载操作符必须有一个类类型参数
3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
4 . . :: sizeof ?: .* 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。
全局的operator<:
所以我们一般都不把运算符重载函数写成全局函数,而上把他写在类中作为成员函数
这里我把全部比较情况都写出来了:
二、赋值运算符重载
Date&operator=(const Date& x) {
//赋值重载函数
if ( this != &x) {
_year = x. _year;
_month = x._month;
_day = x._day;
}
return *this;
}
1. 赋值运算符重载格式:
1.参数类型:const T&,传递引用可以提高传参效率
2.返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
当我们进行连续赋值的时候如果为void类型就会报错,因为d2经过赋值后确实变为d3的值,但d2=d3整体等级与d2.operator(d3)返回值为void赋给d1就会报错
3.检测是否自己给自己赋值 >
4.返回*this :要复合连续赋值的含义
2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。
注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。
默认生成赋值重载和拷贝构造行为一样:
1.内置类型成员-值拷贝/浅拷贝
2.自定义类型成员:会去调用他们的赋值重载
3.当赋值涉及到内存释放之类的时候我们要自己去实现完成深拷贝,不然容易出现错误,其他情况都可以让编译器帮我们写好。
3. 赋值运算符只能重载成类的成员函数不能重载成全局函数
如果一个类中什么成员都没有,简称为空类。
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
赋值重载函数也在这六个函数之中,当我们定义赋值重载函数为全局函数的时候,编译器会认为我们类里面没有自己写赋值重载函数,他会帮我们自己生成一个,这就和我们在全局里面自己定义的赋值重载函数矛盾了。
三、前置++与后置++
![在这里插入图片描述](https://img-blog.csdnimg.cn/175a2da592364e97967ce0fa93d72bf2.png