什么是重载操作符?
重载操作符(Operator Overloading)是面向对象编程中的一种技术,它允许程序员为自定义的数据类型(如类或结构体)重新定义或扩展标准操作符(如 +
、-
、*
、/
等)的行为。这使得这些操作符可以用于用户定义的对象,就像它们可以用于内置的基本数据类型(如整数、浮点数)一样。
为什么要重载操作符?
重载操作符的主要目的是增强类的可用性和可读性,使自定义的类能够像内置类型一样自然地使用操作符。例如,当我们为一个Complex
类重载了+
操作符后,可以直接用类实例化的对象a + b
来表示两个复数的相加,而不是调用一个成员函数a.add(b)
。这不仅使代码更简洁明了,还提高了代码的可维护性和可读性。
示例:
1.重载输入输出符
#include<iostream>
using namespace std;
class Num
{
private:
int a;
public:
Num(int n)
{
a = n;
}
Num() {}//定义一个无参构造
friend istream& operator>>(istream& is, Num& num);
friend ostream& operator<<(ostream& os, Num& num);
};
istream& operator>>(istream& is, Num& num)
{
is >> num.a;
return is;
}
ostream& operator<<(ostream& os, Num& num)
{
os<< num.a<< endl;
return os;
}
int main()
{
Num num;
/*cin 和 cout 是C++标准库中的输入和输出流对象,
用于与用户进行交互。
它们分别属于 std::istream 和 std::ostream 类,
定义在 <iostream> 头文件*/
cin >> num;// >> (两个参数 左参数为 输入cin 右参数为 num)
cout << num << endl;
return 0;
}
结果:
2.重载=
#include<iostream>
using namespace std;
class AA
{
public:
int* p;
public:
AA()
{
p = new int(100);
cout << "AA" << endl;
}
~AA()
{
delete p;
cout << "~AA" << endl;
}
public:
//返回类型为 AA& 是赋值操作符重载的标准做法
AA& operator=(AA& ra)
{
if (p == NULL)
{
p = new int;//规避内存泄漏
}
*p = *ra.p;
return ra;
}
};
int main()
{
AA aa;
cout << *aa.p << endl;
*aa.p = 120;
AA bb;
bb = aa;
cout << *bb.p << endl;
return 0;
}
结果:
3.重载操作符注意事项
#include<iostream>
using namespace std;
class Num
{
private:
int a;
public:
Num(int n)
{
a = n;
}
public:
int operator=(int n);
int operator+(int n);
//对象作为做左参数 可以在类内重载
//对象作为做右参数 必须在类外重载
public:
friend int operator+(int n, Num& ra);
};
int Num::operator=(int n)
{
a = n;
return n;
}
int Num::operator+(int n)
{
return n+a;
}
int operator+(int n, Num& ra)
{
return n + ra.a;//需要加上一个friend
}
int main()
{
Num n=100;// 当直接对对象初始化时 执行的是有参构造
n = 20;//这里会执行一个"="的重载 如果自己不定义重载
//会有一个默认的重载 把n赋值给a
int num1 = n + 10;
//对象作为做左参数 可以在类内重载
//对象作为做右参数 必须在类外重载
int num2 = 10 + n;
cout << num1 << " " << num2 << endl;
return 0;
}
特别注意:
- sizeof() :: . ?:(三木运算不可以重载)
- 对操作符重载 不会改变优先级和结合性
- 重载操作符不允许使用默认参数
- -> [] = () 必须在类内重载 不可以在类外重载
- 对象作为做左参数 可以在类内重载
- 对象作为做右参数 必须在类外重载