一、格式
返回类型 operator 运算符号 (形式参数列表)
{
函数体
}
二、重载运算符的规则
(1)不能改变运算符的优先级、结合型和运算对象数目。
(2)运算符重载函数不能使用默认参数。
(3)重载运算符必须具有一个类对象(或类对象的引用)的参数,不能全是C++的内置数据类型。
(4)一般运算结果作为左值则返回类型为引用类型;若运算结果要作为右值,则返回对象。
(5)重载运算符的功能应该与原来的功能一致。
(6)C++绝大部分运算符可以重载,不能重载的运算符有: . .* :: ?: sizeof
三、运算符重载为类的成员函数
(1)当运算符重载为成员函数时,运算符函数的形式参数的个数比运算符规定的运算对象个数要少一个。(比如重载+运算符,形式参数应该为1个)
原因:类的非静态成员函数都有一个隐含的this指针,运算符函数可以使用this指针隐式地访问类对象的成员,因此这个对象自身的数据可以直接访问,不需要放到形参列表中进行传递,少了的运算对象就是该运算对象本身。
例如:双目运算符重载为类的成员函数,形式如下:
返回类型 类名 :: operator op (const 所属类型 &obj2)
{
.........//this指针对应obj1运算对象
}
经过重载后,表达式“obj1 op obj2”
相当于 obj1.operator op(obj2)
四、运算符重载为友元函数
当运算符重载为友元函数时,运算符的形式参数的个数和运算符规定的运算对象个数一致。(申明为友元函数是因为可以访问私有成员)
形式如下:
class 类名
{
//友元申明
friend 返回类型 operator 运算符号(形式参数列表);
};
返回类型 operator 运算符号(形式参数列表)
{
函数体
}
五、重载流运算符
对<<和>>重载的函数是由标准库iostream规定的,形式如下:
ostream& operator <<(ostream& out,const 类类型 &obj)
{
out<<......//obj数据成员逐个输出
return out;//必须返回ostream对象
}
istream& operator >>(istream& in,const 类类型 &obj)
{
is>>......//obj数据成员逐个输入
return in;//必须返回istream对象
}
之所以两个函数都返回流对象的引用类型,是因为无论流插入或流提取都需要连续输入输出,如cout<<a<<b<<c;因此运算对象应该能作为左值。(因此,流插入和流提取重载函数不能是类的成员函数,否则左运算对象就只能是该类型的对象。)
六、类模板的定义
template <模板形参表>
class 类模板名 {
成员列表
}
(2)如果在类模板外部定义成员函数,形式为:
template <模板形参表>
返回类型 类名<类型参数表>::函数名(形式参数列表)
{
函数体
}
例如:
template <class T>
void Point<T>::Set(const T a,const T b)
{
x=a,y=b;
}
(3)用类模板定义对象时,必须为模板形参显示指定类型实参,一般形式为:
类模板名<类型实参表> 对象名列表
(4)模板形参还可以设置默认值。例如:
template <class T=char,int N=10>
class sequance {...}