1.类和对象
1.1拷贝构造函数(补充)
class Date
{
public:
int _year;
int _month;
int _day;
// 全缺省的构造函数
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
}
int main()
{
Date d1(2024, 4, 14);
Date d2(d1);
Date d3 = d1; //拷贝构造
Date d4(2024, 4, 15); //赋值
d1 = d4;
return 0;
}
1.2运算符重载
运算符重载是 C++ 中的一项强大功能,它允许程序员重新定义已有的运算符,使其能够用于特定的类类型或自定义数据类型。
-
增强代码可读性
- 通过运算符重载,可以使用熟悉的运算符来操作自定义类型的对象,使代码更加直观和易于理解。例如,对于一个表示复数的类,可以重载加法运算符
+
,使得两个复数的相加操作看起来就像对基本数据类型进行加法一样自然。 - 对于自定义的容器类,可以重载下标运算符
[]
,使得访问容器中的元素更加方便。
- 通过运算符重载,可以使用熟悉的运算符来操作自定义类型的对象,使代码更加直观和易于理解。例如,对于一个表示复数的类,可以重载加法运算符
-
提高代码的可维护性
- 当需要对自定义类型进行特定的操作时,使用运算符重载可以将这些操作封装在类的内部,而不是在类的外部使用一系列的函数调用。这样可以提高代码的封装性和可维护性。
- 如果后续需要修改这些操作的实现,只需要在类的内部修改运算符重载函数即可,而不需要在整个代码中查找和修改相关的函数调用。
- 具有特殊函数名的函数。语法结构为:返回值类型 operator操作符()
- 不可以创造新的操作符。
- 必须要有一个类类型参数。
- 内置类型运算符,其含义不能改变。(编译器中不会将此报错,但是把加法硬要重载成减法怎么看也有点离谱)。
- .* :: sizeof ?: . 五个操作符不能重载,其中.*运算符是帮助我们调用成员指针的。
/ 赋值运算符重载
// d2 = d3 -> d2.operator=(&d2, d3)
Date & operator=(const Date& d)
{
Date a;
this->_year = d._year;
this->_month = d._month;
this-> _day = d._day;
return *this;
}
类外对输入输出流的重载
ostream& operator<<(ostream& output, Date& a)
{
cout << a._year << "年" << a._month << "月" << a._day << "天" << endl;
return output;
}
==运算符重载
bool operator==(const Date& d)
{
if (this->_year == d._year)
{
if (this->_month == d._month)
{
if (this->_day == d._day)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
//日期类举例
赋值运算符重载成全局函数,无this指针,需要两个参数。
函数指针与运算符重载各不相同,多个同一运算符重载可以构成函数重载。
一般成员函数重载为成员函数,输入流输出流最好重载为全局函数。