重载操作符的限制
可以重载的操作符
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
不能重载的算符
. :: .* ?: sizeof
操作符重载规则
不改变操作符的优先级
不改变操作符的结合性
不改变操作符所需要的操作数
不能创建新的操作符
成员函数的语法形式为:
类型 类名 :: operator op ( 参数表 )
{
// 相对于该类定义的操作
}
1、重载赋值操作符
赋值操作符重载用于对象数据的复制
operator=必须重载为成员函数
voidoperator = (const classname&it);
classname&operator = (const classname&it);
返回引用会支持如下语法obj1= obj2 = obj3;
2、重载+-*/运算操作符操作符
classnameoperator +(const classname&a) 一元
classnameoperator + (const char *s, const classnamestr)二元
3、重载+=运算操作符操作符
voidoperator +=(const classname&a)
4、<<\>>操作符重载
voidoperator <<(const classname&b)(一元)
classnameoperator <<(classname&a, const classname&b)(二元)
voidoperator >> (class &a)
5、++\--操作符重载
classnameoperator ++ (int),类成员函数重载++--必须带一个int参数,int仅供编译器识别,实际调用的时候不需要任何参数传递。
在代码当中不但要使用object++,还需要使用++object的语法,所以需要定义一个非类成员函数的++重载,语法如下:
classnameoperator ++ (classname&a),非类成员函数重载++--必须带一个指向类实例引用的参数。
6、new/delete操作符重载
重载new和delete必须再关键字operator和操作符之间留下空格,及如下形式:operatornew
重载new第一个参数一定是size_t类型参数,函数必须返回无类型指针。
重载delete第一个参数一定是一个无类型的指针,函数必须没有返回值。
new/delete
操作符重载案例
void*operator new(size_tsize)
{
classname *p = (classname *)malloc(size);
return p;
}
voidoperator delete(void *object)
{
free((classname *)object);
object = NULL;
}
7、重载new[],delete[]
void*operator new[](size_tsize)//size总比实际分配空间大4个字节,存放一些系统内部的处理数据,也就是delete[]释放内存时所需要的数据。
void*operator new[](size_tsize)
{
classname *p = (classname *)malloc(size);
return p;
}
voidoperator delete[](void *object)
{
free((classname *)object);
object = NULL;
}
8、关系操作符==重载
booloperator == (const abc&a);//类成员函数重载==操作符
booloperator == (const clasname&a1, const classname&a2);///非类成员函数重载==操作符
9、下标操作符[]重载
intoperator[](inti);//[]返回int型
int&operator[](inti);//支持object[1]= 8语法.
10、函数调用操作符()重载
返回类型operator() (参数1,参数2)
intoperator()()//重载无参数的()操作符,返回int型
intoperator()(inti)//重载一个int型参数的()操作符,返回int型.
11、地址操作符*/&重载
intoperator * ()//重载*操作符,返回int
int*operator & ()//重载&操作符,返回int*.
12、自动转换和强制类型转换
C++将一个类型赋值给另一个类型是,如果这两种类型兼容,那么C++会自动将这个值转化为接收变量类型。
当C++不能自动转化的时候,需要强制转化
classnamea;
int*p = (int*)a;//强制转化失败,因为a是对象实例名称,C++无法实现将对象实例名称转化为int*。
13、强制转化操作符重载
C++不但允许重载运算操作符,还可以重载强制类型转换操作符,不过强制类型转换必须是C++基本数据类型之一,如int,float,char*等,强制类型转换注意以下几点:
1、定义函数时不允许有参数,不允许有返回类型,但函数必须返回所需类型的值
2、重载函数只可以是类成员函数,不可以为非类成员函数
operatorint()
{
return 整形变量;
}
operatorint*()
{
return 整形变量地址;
}