重载是有规则的,首先,“重载运算符”是“重载”,而不是“定义”,所以只能改变一个C++中已有的运算符,而不是定义一个本来没有的运算符。
1. C++只能重载C++中已有的运算符.如:
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
不能重载的操作符是类属关系运算符 如:
. :: .* ?: sizeof
2. 重载运算符后的优先级和结合性都不会改变。
3.重载的运算符要与该运算本身的含义一致,不能导致混乱。
注:重载运算符时,其参数个数比实际上参与运算的个数少一个。因为该对象自身也将参与运算。
重载类型 operator/*这是一个重载运算符的关键字*/
重载运算符号
{
要执行的内容 return X;//返回一个值(void则不用返回)
}
关系运算符重载
这里要重载的十分多:>,>=,<,<=,==…那么是不是要一一写呢?答案是否定的,实际上你只需要写出一个<重载,然后其他运算符都可以用逻辑运算和已经重载的<表示出。
算数运算符重载
这个就要重载哪个写那个。。。。。。
一.用成员函数或友元函数重载运算符
注:运算符函数也可以重载为成员函数或友元函数
1. 一元运算符
Object op 或 op Object
重载为成员函数,解释为:
Object . operator op ()
操作数由对象Object通过this指针隐含传递
重载为友元函数,解释为:
operator op (Object)
操作数由参数表的参数Object提供
2. 二元运算符
ObjectL op ObjectR
重载为成员函数,解释为:
ObjectL . operator op ( ObjectR )
左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递
重载为友元函数,解释为:
operator op ( ObjectL, ObjectR )
左右操作数都由参数传递
3.用成员函数重载运算符
成员运算符函数的原型在类的内部声明格式如下:
class X
{
返回类型 operator运算符(形参表);
}
在类外定义成员运算符函数的格式如下:
返回类型 X::operator运算符(形参表)
{
函数体
}
(1)双目运算符重载为成员函数
对双目运算符而言,成员运算符函数的形参表中仅有一个参数,它作为运算符的右操作数,此时当前对象作为运算符的左操作数,它是通过this指针隐含地传递给函数的。
(2)单目运算符重载为成员函数
对单目运算符而言,成员运算符函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。
模拟秒表的Time类
class Time
{
public:
Time( ){minute=0;sec=0;}
Time(int m,int s):minute(m),sec(s){ }
Time operator++( ); //声明前置自增运算符“++”重载函数
Time operator++(int); //声明后置自增运算符“++”重载函数
private:
int minute;
int sec;
};
4. 用友元函数重载
一般而言,采用成员函数重载单目运算符时,以下两种方法是等价的:
@aa; // 隐式调用
aa.operator@(); // 显式调用
成员运算符函数operator @所需的一个操作数由对象aa通过this指针隐含地传递。因此,在它的参数表中没有参数。
注:c++中不能用友元函数重载的运算符有= () [] ->
典型
设 A Aobject ;
运算符 ++和 - - 有两种方式:
前置方式: ++Aobject --Aobject
成员函数 重载 A :: A operator++ () ;
解释为: Aobject . operator ++( ) ;
友元函数 重载 friend A operator++ (A &) ;
解释为: operator ++( Aobject ) ;
后置方式: Aobject ++ Aobject --
成员函数 重载 A :: A operator++ (int) ;
解释为: Aobject . operator ++( 0 ) ;
友元函数 重载: friend A operator++ (A &, int) ;
解释为: operator++(Aobject, 0)
二.重载赋值运算符
(1)赋值运算符重载用于对象数据的复制
(2)operator= 必须重载为成员函数
(3)重载函数原型为:
类名 & 类名 :: operator= ( 类名 ) ;
例:
#include
#include
using namespace std;
class Name
{
public :
Name ( char *pN ) ;
Name( const Name & ) ; //复制构造函数
Name& operator=( const Name& ) ; // 重载赋值运算符
~ Name() ;
protected :
char *pName ;
int size ;
} ;
int main()
{ Name Obj1( "zhang" ) ;
Name Obj2 = Obj1 ; // 调用复制构造函数
Name Obj3( "NoName" ) ;
Obj3 = Obj2 = Obj1 ; // 调用重载赋值运算符函数
}
三.重载运算符[]和()
注:(1)运算符 [] 和 () 是二元运算符
(2)[] 和 () 只能用成员函数重载,不能用友元函数重载
1.[] 运算符用于访问数据对象的元素
重载格式 类型 类 :: operator[] ( 类型 ) ;
例:
设 x 是类 X 的一个对象,则表达式
x [ y ]
可被解释为
x . operator [ ] ( y )
2.() 运算符用于函数调用
重载格式 类型 类 :: operator() ( 参数表 ) ;
例:
设 x 是类 X 的一个对象,则表达式
x ( arg1, arg2, … )
可被解释为
x . operator () (arg1, arg2, … )
四.重载流插入和流提取运算符
1.istream 和 ostream 是 C++ 的预定义流类
2.cin 是 istream 的对象,cout 是 ostream 的对象
3.运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
4.运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
5.用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型
运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。