运算符重载基本概念
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数 据类型。
运算符重载(operator overloading)只是一种”语法上的方便”,也就是它只是另一 种函数调用的方式。
在 c++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只 是函数的名字由关键字 operator 及其紧跟的运算符组成。差别仅此而已。它像任何其他函 数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。
语法: 定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被 重载的运算符。函数的参数中参数个数取决于两个因素。 运算符是一元(一个参数)的还是二元(两个参数); 运算符被定义为全局函数(对于一元是一个参数,对于二元是两个参数)还是成员函 数(对于一元没有参数,对于二元是一个参数-此时该类的对象用作左耳参数)
[两个极端] 有些人很容易滥用运算符重载。它确实是一个有趣的工具。但是应该注意,它仅仅是一 种语法上的方便而已,是另外一种函数调用的方式。从这个角度来看,只有在能使涉及类的 代码更易写,尤其是更易读时(请记住,读代码的机会比我们写代码多多了)才有理由重载运 算符。如果不是这样,就改用其他更易用,更易读的方式。 对于运算符重载,另外一个常见的反应是恐慌:突然之间,C 运算符的含义变得不同寻 常了,一切都变了,所有 C 代码的功能都要改变!并非如此,对于内置的数据类型的表示 总的所有运算符是不可能改变的。
运算符重载碰上友元函数
友元函数是一个全局函数,和我们上例写的全局函数类似,只是友元函数可以访问某个 类私有数据
案例: 重载左移操作符(<<),使得 cout 可以输出对象。
// An highlighted block
class Person
{
friend ostream& operator<<(ostream& os, Person& person);
public:
Person(int id,int age)
{
mID = id; mAge = age;
}
private:
int mID;
int mAge;
};
ostream& operator<<(ostream& os, Person& person)
{
os << "ID:" << person.mID << " Age:" << person.mAge;
return os;
}
int main()
{
Person person(1001, 30); //cout << person; //cout.operator+(person)
cout << person << " | " << endl; return EXIT_SUCCESS;
}