C++类和对象
前言:
续上篇第四个默认成员函数赋值重载开始讲起,讲完这个知识,C++中六个默认成员函数中最重要的四个我们都讲了。
一.赋值重载
1.1运算符重载
在讲赋值重载之前要先了解C++运算符重载知识,编译器对内置类型比如int、double类型直接使用运算符,比如整型的大小比较,赋值等等。
这是因为对于内置类型,编译器知道它的比较规则以及处理方法。而对于自定义类型如何进行比较和处理,编译器是不清楚的。在C语言中使用比较函数进行比较:
C++也是实现比较函数完成比较的,但是Date类的成员变量是私有,无法在全局中使用,有没有什么解决方法呢?
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//定义在类里面,对象就可以访问私有成员了
bool Equal(const Date& d)//成员函数有隐藏的this指针
{
return (_year == d._year &&
_month == d._month &&
_day == d._day);
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2023, 1, 22);
Date d2(2023, 1, 21);
d1.Equal(d2);
return 0;
}
函数名Equal的可读性还是可以接受的,但是有不省心的人用奇奇怪怪的函数名,比如Compare,更有甚者xiangdeng。
祖师爷想:规定一个函数名命名方法,于是operator运算符做函数名出现了。
这样一来,当d1.operator==(d2)出现的时候,大家一眼就知道要进行相等判断。
但是做到这一步后,祖师爷觉得还没达到预想的效果,就干脆让d1和d2像内置类型一样使用d1==d2进行相等判断。
在这个过程中实现了相等运算符的重载,本来是用来判断内置类型的,**当在类中实现了运算符,类对象就可以像内置类型一样使用==**,以上就是运算符重载的知识。
关于运算符重载:operator后面加的运算符应该是有在使用的(+、-、>、<、!…等等等),不能自创。比如:@本来就不是运算符,不能operator@进行重载。
1.2赋值重载
讲完运算符重载,我们来讲赋值重载。当在类中定义有相应的运算符重载,类对象才能像内置类型一样使用,如果没有定义就使用则会报错!
那么没有定义赋值运算符,能不能使用呢?
答案是能的,因为它是默认成员函数,不显示定义编译器会生成一个。学完运算符重载,我们就可以自己显示定义一个赋值重载