运算符重载

来源:互联网 发布:centos如何输入命令 编辑:程序博客网 时间:2024/06/15 20:08

一.什么是运算符重载:

C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。
重载为类的成员函数||重载为类的非成员函数。
对于成员函数来说,一个操作数通过this指针隐式的传递,(即本身),另一个操作数作为函数的参数显示的传递;对于友元函数(非成员函数)两个操作数都是通过参数来传递的。
(1)一般来说,弹幕运算符重载为类的成员函数,双目运算符重载为类的友元函数(一般情况下)
(2)双目运算符不能将 = 。 ()【】。-> 重载为类的友元函数。
(3)如果运算符的第一次操作数要求为隐式转换则必须为友元函数。
(4)当最左边的要求为类对象,而右边的是一个内置类型,则要为友元函数。

二.运算符重载的实质:
运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:operatorp(argument-list)//operator 后面的’p’为要重载的运算符符号。

类的运算符重载
重载知识点
1.重载运算符
1.1引言
1.2限定及重载语法
1.2.1限定
1.2.2重载语法
1.3重载运算符设计指导
1.4成员/非成员函数重载
1.5成员函数重载
1.6非成员函数(友元函数)重载
1.7重载实例
1.7.1重载输入输出符<<,>>
1.7.2重载算法运算符+,-
1.7.3重载关系运算符==,!=,>,<=,<,>=
1.7.4重载赋值运算符=
1.7.5重载下标结算符[]
1.7.6重载前置自增++,自减–和重载后置自增++,自减–
1.7.7重载成员访问符->和*
1.7.8重载调用操作符()
1.7.9重载转换操作符operator (type)


1前言
重载运算符目的:
1.用操作整数的各种运算方法,让运算符重载让类也具有整数的各种简单运算
2.我们对类产生的对象进行非常方便的运算操作,让代码、简洁明了,操作方便


2 定义
2.1限定及重载语法
可以重载的运算符
+ - * / % ^
& | ~ ! = < >
+= -= *= /= %= ^= &= |=
<< >> >>= <<=
== != <= >=
&& ||
++ – -> * , [] ()
new delete new[] delete[]

不可以重载的运算符
:: . .* ?: sizeof typeid
分类
算术运算符 + - * / % ^ ++ –
复合算术运算符 += -= *= /= %= ^=
位运算符 & | ~ !
复合位运算符 &= |=
逻辑运算符 && ||
关系运算符 == != <= < > >=
内存管理符 new delete new[] delete[]
输入输出运算符 << <<= >> >>=


2.2定义重载语法
语法:returntype operator op(类参数)
中文: 返回类型 operator 运算符号(参数)
例子:
item operator+(const item&,const item&);


2.3成员函数实现操作符重载

使用情况:通常对类本身的运算符重载
如类nameclass的运算符函数名称operator op
如x,y都是类nameclass的生成的对象,如果重载并实现了operator op
我们可以做这样的计算x op y,编译器会自动翻译成如下x.operator op(y)
如op是重载的运算符是加法(+),那么可变成x+y,编译器会变成x.operator+(y)
计算顺序是:
x op y变成x=x op y,运算结果存入到x,
x.operator+(y)
第一个操作数是类的对象x,也就是隐含的对象指针this,
第二个操作数是参数y,对象X与的数据成员逐个一一相加,
返回结果:是计算完毕后返回到左边的对象,它返回的必须是对象,而不能是其它数据类型
.重载下标[]取值运算符实例
定义operator[]
class foo
{
private:
vector data;
public:
int& operator[] (const size_t);
};
实现operator[]
int& foo::operator[](const size_t index)
{ return data[index]; }


2.4非成员函数(友元函数)实现操作符重载
使用情况:类的对象之间进行的算法运算符,关系运算符,输入输出
假设#是运算符号
类nameclass的友元函数重载名称operator#
如x,y都是类nameclass的生成的对象,如果重载并实现了友元函数 operator#
我们可以做这样的计算x # y,编译器会自动翻译成如下operator#(x,y)
计算顺序是:
x op y变成op(x,y),运算结果存入到新的临时对象,operator+(x,y)
绝对无对象指针this,返回值不会存入到x,y,而是返回新的临时对象
第一个操作数是类的对象x,
第二个操作数是参数y,
对象X与Y的数据成员逐个一一相加,
返回结果:建立一个新的返回对象,如算术运算符返回另一个对象,关系运算符返回bool值
类的运算符重载的友元函数实现格式
友元函数定义格式
friend returntype operator op(const classname&,const classname&)const;
友元函数实现格式
returntype operator op(const classname&,const classname&)
{
//代码控制
return (values);
}


3重载实例
3.1重载输入输出符<<,>>
3.2重载算法运算符-,*,/,%,^
3.3重载关系运算符==,!=
3.4重载赋值运算符=
3.5重载下标结算符[]
3.6重载前置自增++,自减–和重载后置自增++,自减–
3.7重载成员访问符->和*
3.8重载调用操作符()
3.9重载转换操作符operator (type)


3.1重载<<,>>
当我们对一个类重载<<,>>运算符之后,就可以直接使用cout<

原创粉丝点击