目录
概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据运算
运算符重载也可以函数重载
而对于内置数据类型,编译器知道如何进行运算
加号运算符重载
operator+
左移运算符重载
operator<<
作用:配合友元可以输出自定义数据类型
不会利用成员函数重载<<运算符,因为无法实现<<在左侧
只能利用全局函数重载左移运算符
递增运算符重载
operator++
重载前置++运算符
先递增,再运算
返回的是递增后的引用
//返回引用是为了一直对一个数据进行递增操作
myInt& operator++() {
num++;
return *this;
}
重载后置++运算符
先运算,再递增
返回的是递增前的值
//int代表占位参数,用于区分前置和后置递增
myInt operator++(int) {
myInt temp = *this;
num++;
return temp;
}
赋值运算符重载
operator=
编译器默认提供的赋值运算符重载是浅拷贝
因此在析构时,会造成堆区内存重复释放的报错
class Person{
private:
int* num;
public:
Person(int age) {
num =new int;
*num = age;
}
~Person() {
if (num != NULL) {
delete num;
num = NULL;
}
}
Person& operator=(Person& p) {
//如果在堆区已有内存,先释放
if (num != NULL) {
delete num;
num = NULL;
}
num = new int;
*num = *p.num;
return *this;
//返回的是引用,可以实现连续赋值
}
};
关系运算符重载
函数调用运算符重载
operator()
由于使用起来非常像函数调用,因此叫仿函数
class MyPrint {
public:
void operator()(string test) {
cout << test;
}
};
int main() {
MyPrint myPrint;
myPrint("hello World");
}
- 函数调用运算符重载在类里
- 使用时,先创建一个这个类的对象,对象(仿函数参数)