C/C++培训
达内IT学院
400-996-5531
1. 双目运算符重载
1.1格式:
L/*左操作数*/ # /*操作符*/ R/*右操作数*/
L#R
=> L.operator#(R) 成员形式,写在类中,成员函数形式
=> operator#(L,R) 非成员形式 //需要定义为类的友元函数
如:
cout 《 c1;
=> cout.operator《(c1)
=> operator《(cout,c1)
1.2实际操作形式:
类名 operator+(const 类名& 对象名)
{ return 类名(…,…);//构建的一个匿名对象}
类名 operator-(const 类名& 对象名)
{ return 类名(…,…);//构建的一个匿名对象}
类名& operator+=(const 类名& 对象名)
{ return *this = *this + 对象名;}
类名& operator-=(const 类名& 对象名)
{ return *this -= *this - 对象名;}
2. 单目运算符的重载
2.1格式:
#/*操作符*/O/*操作数*/
=>O.operator#();//成员形式
=>operator#(O); //非成员形式
如:
cout 《 -c1 《 endl;
c1.operator-();//成员函数形式
operator-(c1);//非成员函数形式
2.2实际操作形式:
类名 operator-(void)
{ return 类名(-…,-…);}
注意:
对于运算符重载的两种形式中,优先调用成员函数形式
3.关于自增自减运算符的使用:
(1) 前缀自增自减运算符
a.表达式的值是增减以后的值
b.运算函数返回的是操作数的引用
c.成员函数形式的运算符函数没有参数,友元函数形式的运算符函数只有一个参数:操作数
d.可以连用
class A
{ A& operator++(){ ++m_r;++m_i;return *this;}};//成员函数形式
A& operator(A& a)//友元函数形式
{
++m_r;++m_i;
return a;
}
注意:加引用就是为了连续使用;
(2) 后缀自增自减运算符
a.表达式的值是增减以前的值
b.运算函数返回的是操作数增减以前的副本
c.成员函数形式的运算符函数有int类型的哑元参数,友元函数形式的运算符函数有两个参数:操作数 和 哑元
d.不可以连用
class A
{ const A operator++(int){return(m_r++,m_i++);}};//成员函数形式
const A operator++(A& a,int)//友元函数形式
{ return A(a.m_r++,a.m_i++);}
注意:加const就是为了防止连续运算
4. 类型转换运算符函数
4.1格式:
在源类型中定义如下形式的运算符函数
operator 目标类型(void)
{
构造一个目标类型的对象返回(目标类型也可以是基本数据类型)
}
功能:
将一个类的对象转换成另一个类型的数据,该函数没有返回值类型;
注意:
如果在源类型中提供类型转换运算符函数的同时,在目标类型中定义支持类型转换的构造函数,对于隐式类型转换,系统会优先选择类型转换运算符函数 完成转换,而对于显式类型转换,系统优先选择构造函数(建议只提供构造函数即可,因为可以使用explicit 关键字修饰构造函数,表示该构造函数只能用于显示类型转换,从而防止潜在的错误;)
扩展:
如果一个类类型对象和一个基本数据类型运算时,怎么处理?
Complex c(2,3);
cout 《 "c + 100 " 《 c + 100 《 endl;//c.operator+(100);
5.不允许用户重载的运算符
::作用域解析操作符
. 成员访问操作符
.* 成员指针解引用
: 三目运算符
sizeof 字节长度运算符
typeid 类型信息操作符
注意:
(1)操作符的操作数中没有类类型的操作数时,不能重载
(2)不能通过运算符重载去发明新的操作符,比如:**
6.只能定义为成员函数的运算符
(1)下标操作符[] (见代码xibiao.cpp)//
//支持下标运算符的重载
int operator[](int n)
{ return m_data[n];}
(2)函数操作符() (见代码funOperator.cpp)//
class Square
{public://支持()运算符重载
int operator()(int n)
{return n*n;}};
(3)间接操作符*,-> (见代码 jianjie.cpp)//智能指针类
//智能指针类
class PA
{private:A* m_pa;
public:PA(A* pa):m_pa(pa){}
~PA(void)
{delete m_pa;m_pa = NULL;}
//支持->运算符函数
A* operator->(void)
{return m_pa;}
//支持*运算符重载
A& operator*(void)
{ return *m_pa;}};
7.new / delete 运算符的重载
应用:
一般把构造函数调用之前的初始化工作放在new运算符的重载函数中
一般把析构函数调用之后的善后工作放在delete运算符的重载函数中
例子://new []运算符进行重载
static void* operator new[](size_t size)
{void* p = malloc(size);cout 《 "我自己的New[]:size = " 《 size 《 ",p = " 《 p 《 endl;return p;}
// delete[] 运算符重载
static void operator delete[](void* p)
{cout 《 "我自己的delete[]:p = " 《 p 《 endl;free(p);}
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved