为什么对运算符重载?
C++中预定义中的运算符的操作对象只限于基本的内置数据类型,但对于我们自定义的类型是没办法操作的,但是在实际开发中,我们要对自定义的类进行类似于内置数据类型的操作运算,这时就需要我们对运算符进行重载,给运算符新的功能,满足实际需求。
C++ 运算符重载的实质?
运算符重载的实质是函数重载或者函数多态,让开发人员用相同的函数名字完成不同的基本操作。运算符函数形式如下:
<返回类型说明符> operator <运算符符号>(<参数表>)
{
<函数体>
}
找个简单的例子 验证一下:
int operator<<(const int num);//声明
int Widget::operator<<(const int num)//定义
{
return num*3;
}
int b = w<<10;//定义
qDebug()<<b;
运算符重载的规则:
(1)为了防止开发人员对标准的内置运算符进行重载,比如你要重载加法(+),把+重载成乘法 (*),当你输入int a ,int b后,会导致重载以后的二义性,因此要重载运算符的操作对象中 必须有 一个自定义的类型。
(2)不能改变运算符的优先级,不能创建新的运算符。
(3)不能进行重载的运算符:成员运算符,作用域运算符,条件运算符,sizeof运算符,typeid (一个RTTI运算符),const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转 换运 算符
重载运算符有两种形式?
重载为类的成员函数,或者重载为友元函数(类的非成员函数)
(1)重载为类的成员函数。
#ifndef PERSON_H
#define PERSON_H
class Person
{
public:
Person();
Person(int age,int sal);
int getworkAge();
int getsalary();
Person operator*(const int num);
friend Person operator+(const Person num1,const Person num2)
{
Person sum;
sum.workAge = num1.workAge + num2.workAge;
sum.salary = num1.salary+num2.salary;
return sum;
}
private:
int workAge;
int salary;
};
#endif // PERSON_H
#include "person.h"
Person::Person()
{
workAge = 0;
salary = 0;
}
Person::Person(int age, int sal)
{
workAge = age;
salary = sal;
}
Person Person::operator*(int num)
{
Person sum;
sum.workAge=workAge*num;
sum.salary =salary*num;
return sum;
}
int Person::getworkAge()
{
return workAge;
}
int Person::getsalary()
{
return salary;
}
结果:
10 15
友元函数:
friend Person operator+(const Person num1,const Person num2)
{
Person sum;
sum.workAge = num1.workAge + num2.workAge;
sum.salary = num1.salary+num2.salary;
return sum;
}
Person a1(50,50);
Person a2(50,50);
Person a3 = a1+a2;
qDebug()<<a3.getworkAge()<<a3.getsalary();
结果:
100 100
经验之谈:
一般来说:单目运算符重载为类的成员函数,双目运算符重载为类的友元函数.
双目运算符不能将 = 。 ()【】。-> 重载为类的友元函数。
当最左边的要求为类对象,而右边的是一个内置类型,则要为友元函数。