文章目录
- 1.运算符重载
- (1)
- (2)运算符重载的语法:
- (3)运算符重载的注意事项:
- (4)前置++和后置++重载区别
- 2.const成员函数
- 3.取地址及const取地址操作符重载
- 4.总结
1.运算符重载
(1)
我们知道内置类型(整形,字符型,浮点型…)可以进行一系列的加减乘除运算,那么我们自定义的类型可以像内置类型一样加减乘除运算吗?那么我们来实践看看吧,毕竟是实践出真理嘛。
#include <iostream>
using namespace std;
class Date
{
public:
Date(int year=0,int month=0,int day=1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;//这里命名加_是为了和形参区别开来
int _month;
int _day;
};
int main()
{
Date d1;
Date d2;
d1 + d2;
return 0;
}
我们可以看看这个代码,看看d1+d2能否进行运算。
直接就报错了,由此证明自定义类型是不能直接进行运算的,其实内置类型也是由那些大牛们在标准库里面为我们实现好了内置类型的运算,所有我们可以直接使用内置类型的运算。那么我们该如何做才能让自定义类型像内置类型一样进行运算呢?其实我们可以用运算符重载就可以实现该功能。由此引出了运算符重载。
(2)运算符重载的语法:
返回类型+operator+需要重载的运算符的符号+(参数) 注意:一般运算符重载的参数是为一个
运算符重载的例子:
bool operator==(const Date& d2)
{
return _year == d2._year
&& _month == d2._month
&& _day == d2._day;
}
(3)运算符重载的注意事项:
(1)不能通过连接其他符号创建不存在的运算符,例如operator@
(2)重载操作符必须有一个类类型的参数(一般是this指针)
(3)内置类型的运算符不能修改
(4).* :: sizeof ?: .这五个运算符不能进行重载
(5)赋值运算符重载也可能会出现浅拷贝问题(这个不理解可以去看看我上篇博客)
(4)前置++和后置++重载区别
#include <iostream>
using namespace std;
class Date
{
public:
Date(int year=0,int month=0,int day=1)
{
_year = year;
_month = month;
_day = day;
}
//前置++返回+1之后的结果
//this出了作用域不会被销毁,所以使用引用返回,提高效率
Date& operator++()
{
_day += 1;
return *this;
}
//后置++返回+1之前的结果
//tmp是临时对象,出了作用域就不存在了,所以使用值返回
Date operator++(int)//这里为什么又int呢?是为了和前置++区别开来
{
Date tmp = (*this);
_day += 1;
return tmp;
}
private:
int _year;//这里命名加_是为了和形参区别开来,C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递
int _month;
int _day;
};
int main()
{
Date d1(1999,1,1);
Date d2=d1++;
Date d3=++d1;
return 0;
}
2.const成员函数
(1)定义:const修饰的成员函数叫const成员函数,const修饰成员函数实际是修饰成员函数的this指针,const修饰该成员函数表示该成员函数不能对类的任何成员进行修改。
编译器对const成员的处理
3.取地址及const取地址操作符重载
这两个函数一般不用重新定义,编译器会默认生成
Date* operator&()
{
return this;
}
//返回值也只能是const
const Date* operator&() const
{
return this;
}
4.总结
6个默认成员函数到这里已经总结完了,这6个默认成员函数分别是构造函数,拷贝构造,析构函数,赋值运算符重载,const成员函数,&和const &函数