重载运算符operator

运算符重载注意点:

1.算术和关系操作符返回的是一个左值或右值,而不是一个引用

2.赋值操作符一定要定义为成员函数如“=”

3.一般而言,赋值操作符和复合赋值操作符应返回左操作数的引用如"="和''+="

C++不允许赋值运算符被重载为全局形式,这是因为如果可以写出全局形式的赋值运算符函数的话,我们可以写出这样的函数:

从而出现这样的语句:

现在我们写一个简单的integer类并重载赋值运算符:

因为在自赋值的情况下可能给对象造成伤害,所以在重载赋值运算符时必须要注意自赋值的情况

所以integer类中的赋值运算符函数应写成这样:

1、 运算符重载的概念

运算符重载是C++的重要组成部分,它可以让程序更加简单易懂,简单的运算符可以使复杂函数的理解更直观。对于普通对象来说可以使用算术运算符让它们参与计算,C++也允许为类的对象构造运算符来实现单目或双目运输,这个特性就叫运算符的重载。其实,任何使用运算符完成的功能,使用普通的函数也能够完成。运算符的重载主要存在两种形式,一种是作为类的友元函数进行使用,另一种则是作为类的成员函数进行使用。运算符的重载的形式为:

2、 运算符的运算规则
重载运算符operator返回类型operator运算符符号(参数说明)

重载运算符operator重载运算符operator
{//函数体的内部实现

重载运算符operator


重载运算符operator}

①运算符重载函数也是函数,重载的运算符不会改变运算符的优先级、结合型和参数的个数。

②重载运算符不能违反语言的语法规则。

③赋值运算符除外,重载运算符可由派生类继承下去。

④重载运算符不能使用默认参数。

⑤运算符=()[]->可作为类成员运算符,不能作为友元运算符。

⑥运算符“.”、“::”、“?:”不能重载。

⑦友元运算符的参数规则与类成员运算符的参数规则不同,一员运算符必须显示地声明一个参数,二员运算符必须显示地声明两个参数。类成员运算符重载时,参数中隐含了一个this指针。

3、 实例代码

1)下面是重载函数作为友元函数的形式


重载运算符operator#include<iostream>

重载运算符operator
usingstd::cout;

重载运算符operator
usingstd::endl;

重载运算符operator重载运算符operator
/*******/

重载运算符operator重载运算符operator
//声明复数类

重载运算符operator/
********
/

重载运算符operator
classComplex

重载运算符operator重载运算符operator
{

重载运算符operator
public:

重载运算符operator
//Attribute

重载运算符operator
intx;

重载运算符operator
inty;

重载运算符operator
//Operator

重载运算符operator重载运算符operator
voidSetX(inta){x=a;}

重载运算符operator重载运算符operator
voidSetY(intb){y=b;}

重载运算符operator

重载运算符operator friend Complex
operator+(Complex&, Complex&);

重载运算符operator friend Complex
operator-(Complex&, Complex&);

重载运算符operator friend Complex
operator(Complex&, Complex&);

重载运算符operator friend Complex
operator/(Complex&, Complex&);

重载运算符operator

重载运算符operator friend Complex
operator++(Complex&);//前置方式

重载运算符operator
friend Complexoperator++(Complex&,int);//后置方式

重载运算符operator
}
;

重载运算符operator
//"+"重载运算符

重载运算符operator
Complexoperator+(Complex&temp1,Complex&temp2 )

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=temp1.x+temp2.x;

重载运算符operator ret.y
=temp1.y+temp2.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"-"重载运算符

重载运算符operator
Complexoperator-(Complex&temp1,Complex&temp2 )

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=temp1.x-temp2.x;

重载运算符operator ret.y
=temp1.y-temp2.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"
"重载运算符

重载运算符operator
Complexoperator(Complex&temp1,Complex&temp2 )

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=temp1.x
temp2.x;

重载运算符operator ret.y
=temp1.ytemp2.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"/"重载运算符

重载运算符operator
Complexoperator/(Complex&temp1,Complex&temp2 )

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=temp1.x/temp2.x;

重载运算符operator ret.y
=temp1.y/temp2.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"++"前置运算符

重载运算符operator
Complexoperator++(Complex&temp1)

重载运算符operator重载运算符operator
{

重载运算符operator temp1.x
=temp1.x+1;

重载运算符operator temp1.y
=temp1.y+1;

重载运算符operator
returntemp1;

重载运算符operator}


重载运算符operator
//"++"后置运算符

重载运算符operator
Complexoperator++(Complex&temp1,int)

重载运算符operator重载运算符operator
{

重载运算符operator temp1.x
=temp1.x++;

重载运算符operator temp1.y
=temp1.y++;

重载运算符operator
returntemp1;

重载运算符operator}


重载运算符operator
//主函数()

重载运算符operator
intmain()

重载运算符operator重载运算符operator
{

重载运算符operator Complex Complex1;

重载运算符operator Complex Complex2;

重载运算符operator Complex Ret;

重载运算符operator

重载运算符operator Complex1.SetX(
30);

重载运算符operator Complex1.SetY(
40);

重载运算符operator

重载运算符operator Complex2.SetX(
10);

重载运算符operator Complex2.SetY(
20);

重载运算符operator

重载运算符operator cout
<<"重载加法运算"<<endl;

重载运算符operator Ret
=Complex1+Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"重载减法运算"<<endl;

重载运算符operator Ret
=Complex1-Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"重载乘法运算"<<endl;

重载运算符operator Ret
=Complex1
Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"重载除法运算"<<endl;

重载运算符operator Ret
=Complex1/Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"前置++运算"<<endl;

重载运算符operator Ret
=++Complex1;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"后置++运算"<<endl;

重载运算符operator Ret
=Complex1++;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator
return0;

重载运算符operator}

2)下面是重载函数作为成员函数的实例代码:


重载运算符operator#include<iostream>

重载运算符operator
usingstd::cout;

重载运算符operator
usingstd::endl;

重载运算符operator重载运算符operator
//*********/

重载运算符operator重载运算符operator
//声明复数类

重载运算符operator/
********
/

重载运算符operator
classComplex

重载运算符operator重载运算符operator
{

重载运算符operator
public:

重载运算符operator
//Attribute

重载运算符operator
intx;

重载运算符operator
inty;

重载运算符operator
//Operator

重载运算符operator重载运算符operator
voidSetX(inta){x=a;}

重载运算符operator重载运算符operator
voidSetY(intb){y=b;}

重载运算符operator
//成员函数

重载运算符operator
Complexoperator+(Complex&);

重载运算符operator Complex
operator-(Complex&);

重载运算符operator Complex
operator(Complex&);

重载运算符operator Complex
operator/(Complex&);

重载运算符operator Complex
&operator++();//前置方式

重载运算符operator
Complex&operator++(int);//后置方式

重载运算符operator
}
;

重载运算符operator
//"+"重载运算符

重载运算符operator
Complex Complex::operator+(Complex&temp1)

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=x+temp1.x;

重载运算符operator ret.y
=y+temp1.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"-"重载运算符

重载运算符operator
Complex Complex::operator-(Complex&temp1)

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=x-temp1.x;

重载运算符operator ret.y
=y-temp1.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"
"重载运算符

重载运算符operator
Complex Complex::operator(Complex&temp1)

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=x
temp1.x;

重载运算符operator ret.y
=ytemp1.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"/"重载运算符

重载运算符operator
Complex Complex::operator/(Complex&temp1)

重载运算符operator重载运算符operator
{

重载运算符operator Complex ret;

重载运算符operator ret.x
=x/temp1.x;

重载运算符operator ret.y
=y/temp1.y;

重载运算符operator
returnret;

重载运算符operator}


重载运算符operator
//"++"前置运算符

重载运算符operator
Complex&Complex::operator++()

重载运算符operator重载运算符operator
{

重载运算符operator x
=x+1;

重载运算符operator y
=y+1;

重载运算符operator
return
this;

重载运算符operator}


重载运算符operator
//"++"后置运算符

重载运算符operator
Complex&Complex::operator++(int)

重载运算符operator重载运算符operator
{

重载运算符operator x
=x++;

重载运算符operator y
=y++;

重载运算符operator
returnthis;

重载运算符operator}


重载运算符operator
//主函数()

重载运算符operator
intmain()

重载运算符operator重载运算符operator
{

重载运算符operator Complex Complex1;

重载运算符operator Complex Complex2;

重载运算符operator Complex Ret;

重载运算符operator

重载运算符operator Complex1.SetX(
30);

重载运算符operator Complex1.SetY(
40);

重载运算符operator

重载运算符operator Complex2.SetX(
10);

重载运算符operator Complex2.SetY(
20);

重载运算符operator

重载运算符operator cout
<<"重载加法运算"<<endl;

重载运算符operator Ret
=Complex1+Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"重载减法运算"<<endl;

重载运算符operator Ret
=Complex1-Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"重载乘法运算"<<endl;

重载运算符operator Ret
=Complex1
Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"重载除法运算"<<endl;

重载运算符operator Ret
=Complex1/Complex2;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"前置++运算"<<endl;

重载运算符operator Ret
=++Complex1;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator

重载运算符operator cout
<<"后置++运算"<<endl;

重载运算符operator Ret
=Complex2++;

重载运算符operator cout
<<"Ret.x="<<Ret.x<<endl;

重载运算符operator cout
<<"Ret.y="<<Ret.y<<endl;

重载运算符operator
return0;

重载运算符operator}



输出结果如下图所示:

重载运算符operator
原文链接: https://www.cnblogs.com/hgy413/archive/2010/08/25/3693697.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14312

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午1:51
下一篇 2023年2月7日 下午1:52

相关推荐