函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
1.函数重载的规则
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
2.运算符重载
所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。运算符重载是通过函数实现的,它本质上是函数重载。允许重载的运算符:
运算符名称 | 运算符 |
双目算术运算符 | +、-、*、、、% |
关系运算符 | ==、!=、、= |
逻辑运算符 | ||、&&、! |
单目运算符 | +、-、*(指针)、&(取地址) |
自增自减运算符 | ++、– |
位运算符 | |、&、-、……、> |
赋值运算符 | =、+=、-=、*=、/=、%=、&=、!=、^=、>= |
空间分配和释放 | new、delete、new[]、delete[] |
其他运算符 | ()(函数调用) 、->(成员访问)、->*(成员指针访问)、 ,(逗号) |
不允许重载的运算符:
运算符名称 | 运算符 |
成员访问运算符 | . |
成员指针访问运算符 | . * |
域运算符 | :: |
长度运算符 | sizeof() |
条件运算符 | ?: |
运算符重载的形式有两种:重载函数作为类的成员,重载函数作为类的友元函数;根据运算符操作数的不同,双目运算符作为类成员函数,单目运算符作为类的成员函数,双目运算符作为类的友员函数,单目运算符作为类的友元函数。
- 双目运算符作为友元函数时需要制定两个参数。
- 运算符重载函数作为类成员函数可以显式调用。
3.常用运算符重载
(1)自增自减:
//前置运算符 ++a --a
operator++()
operator--()
operator++(Vector3 &v)
operator--(Vector3 &v)
//后置运算符 a-- a++
operator++(int)
operator--(int)
operator++(Vector3 &v,int)
operator--(Vector3 &v,int)
(2)赋值运算符:
String& String::operator=(String &s)
{
if(this!=&s)
{
delete[] str;
int length = strlen(s.str);
str = new char[length+1];
strcpy(str,s.str);
}
return (*this)
}
(3)输入\输出运算符重载:
friend ostream &operator<<( ostream &output,const Vector3 &v )
{
output << "F : " <<v.m_x<< " I : " << v.m_y<<v.m_z;
return output;
}
friend istream &operator>>( istream &input, Vector3 &v )
{
input >> v.m_x>> v.m_y>>v.m_z;
return input;
}