1、运算符重载的本质是函数重载。
2、具体格式:
函数类型 operator 运算符名称(形参表列)
{
重载实体;
}
3、举例:
const Complex operator+(const Complex &c1,const Complex &c2);
我们会说,operator+ 重载了运算符+ 。
4、重载的规则:
4.1 C++不允许用户自己定义新的运算符,只能对已有的 C++运算符进行重载。
4.2 不能重载的运算符只有 4 个:(.成员选择符 .*成员对象选择符 ::域解析操作符 ?:条件操作符)
4.3 重载不能改变运算符运算对象的个数。比如+需要两个参数,重载后也是一样的。
4.4 重载不能改变运算符的优先级别。
4.5 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数。
4.6 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。
也就是说,参数不能全部是 C++的标准类型,以防止用户修改用于标准类型数据成员的运算符的性质。
下面这样是不对的:
int operator + (int a,int b)
{
return(a-b);
}
原来运算符+的作用是对两个数相加,现在企图通过重载使它的作用改为两个数相减。
如果允许这样重载的话,如果有表达式 4+3,它的结果是 7 还是 1 呢?显然,这是绝对要禁止的。
4.7 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是普通函数。
5、一个特例总结:
//前++的成员函数
Complex & operator++() // c1.operator++()
{
this->a++;
this->b++;
return *this;
}
//后++成员函数
const Complex operator++(int)
{
Complex temp(this->a, this->b);
a++;
b++;
return temp;
}
6、以重载+为例,看下具体代码:
//全局提供一个+号操作符重载
Complex operator+(Complex &c1, Complex &c2)
{
Complex temp(c1.a + c2.a, c1.b + c2.b);
return temp;
}
//操作符重载的成员函数
Complex operator+(Complex &another)
{
Complex temp(this->a + another.a, this->b + another.b);
return temp;
}
7、等号操作符:
Student & operator=(const Student & another_s)
{
if (this->name != NULL)
{
//原来有数据 需要释放
delete[] this->name;
this->name = NULL;
this->id = 0;
}
//到这位置,之前的数据释放完毕
this->id = another_s.id;
int len = strlen(another_s.name);
this->name = (char*)malloc(len + 1);
strcpy(this->name, another_s.name);
return *this;
}