代码改变世界

7--操作符重载(1)

2013-11-28 17:21  gongti  阅读(228)  评论(0编辑  收藏  举报
(1)操作符重载意义
对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,
对于用户自己定义的class,如果想要支持基本操作,比如比较大小,判断是否相等,等等。
则需要用户自己来定义关于这个操作符的具体实现。

 
(2)重载操作符的定义格式
定义一个重载操作符和定义一个函数,不过函数的名字的关键字operator
后面接要定义的操作符号,定义格式:
返回类型  operator操作符(参数列表) 
(3)可重载的操作符
在C++中几乎所有的操作符都可以重载,不过也是有几个是不可以重载的。
四个不可以重载的操作符
成员访问运算符.    作用域运算符::  长度运算符sizeof  条件运算符 ?:   
 
(4)运算符重载的原则
1.C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符。
2.运算符重载后不能改变运算符的操作对象(操作数)的个数。如:"+"是实现两个操作数的运算符,重载后仍然为双目运算符。
3.重载不能改变运算符原有的优先级和原有的结合性。
4.运算符重载不能全部是C++中预定义的基本数据,这样做的目的是为了防止用户修改用于基本类型数据的运算符性质。
 
(5)两种实现方式
class 类名
{
    friend 返回类型 operator 操作符(形参表);
};
//类外定义格式:
返回类型 operator操作符(参数表)
{
    //函数体
}
class 类名
{
public:
    返回类型 operator 操作符(形参表);
};
//类外定义格式
返回类型 类名::operator 操作符(形参表)
{
    //函数体
}
 
类成员实现操作符重载需要的形式参数比原来少一个,这比如:利用类成员函数实现一元操作符”-“,就不需要参数了。
也正是因为这个原因,友元函数实现的操作符重载是有限制的,
比如下标[] ,调用(),成员指向-> 复制=  等不能利用友元函数实现运算符的重载。
 
在实际开发过程中,单目运算符建议重载为成员函数,而双目运算符建议重载为友元函数。
通常下双目运算符重载为友元函数比重载为成员函数更方便,但是有时双目运算符必须重载为成员函数,例如赋值运算符=。
还有如果需要修改对象内部的状态,一般可以选择利用类成员函数进行修改。