重载操作符

重载操作符的限制 

可以重载的操作符

+  -  *  /  %  ^  &  |  ~

!  =  <  >  +=  -=  *=  /=  %

^=  &=  |=  <<  >>  >>=  <<=  ==  !=

<=  >=  &&  ||  ++  --  ->*  ‘  ->

[]  ()  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 整形变量地址;

}



























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值