运维开发网

你真的了解C++重载运算符吗

运维开发网 https://www.qedev.com 2022-05-03 16:05 出处:网络
这篇文章主要为大家详细介绍了C++重载运算符,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

这篇文章主要为大家详细介绍了C++重载运算符,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

运算符实际上是一个函数,所以运算符的重载实际上就是函数的重载。编译器对运算符重载的选择遵循函数重载的原则。当遇到不明显的操作时,编译器会寻找与参数匹配的操作函数。


1.重载运算符的必要性

C++语言中的数据类型分为基本数据类型和构造数据类型。基本数据类型可以直接执行算术运算。例如:

#includelt;bits/stdc++.hgt;using namespace std;int main(void){int a=10;int b=20;coutlt;lt;a+blt;lt;endl;}

程序实现了两个整数变量的相加,并能正确输出运行结果30。两个浮点变量和两个双精度变量可以使用加法运算符+直接求和。但是,类属于新构造的数据类型,因此类的两个对象不能通过加法运算符相加。例如:

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:CBook(int iPage){m_iPage=iPage;}void display(){coutlt;lt;m_iPagelt;lt;endl;}protected:int m_iPage;};int main(void){CBook book1(10);CBook book2(20);tmp=book1+book2;//错误tmp.display(); }

当编译器编译到语句book1+book2时,会报错,因为编译器不知道如何把两个对象相加。添加两个类对象有两种方式,一种是通过成员函数,另一种是通过重载运算符。

首先看通过隶属函数法求和的例子:

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:CBook(int iPage){m_iPage=iPage;}int add(CBook a){return m_iPage+a.m_iPage;}void display(){coutlt;lt;m_iPagelt;lt;endl;}protected:int m_iPage;};int main(void){CBook book1(10);CBook book2(20);coutlt;lt;book1.add(book2)lt;lt;endl;}

程序运行正确。使用成员函数求和的形式比较简单,也不利于代码重用。如果要累加多个对象,代码的可读性会大打折扣。使用重载运算符可以解决这些问题。


2.重载运算符的形式与规则

重载运算符以下列形式声明:

operator类型名():

运算符是需要重载的运算符。整个语句没有返回类型,因为类型名代表它的返回类型。重载运算符将一个对象转换为由类型名指定的类型,转换的形式就像造型一样。但如果没有重载的运算符定义,直接强制类型转换会导致编译器编译失败。

重载运算符不能是新创建的运算符,只能是C++语言中已有的运算符。可以重载的运算符如下:

算术运算符:+-*/%++-

位运算运算符:amp| ~ ^ gt;gt;lt;lt;

逻辑运算符!ampamp||

比较运算符lt;gt;gt;= lt= == !=

赋值运算符=+=-= * =/= % = amp;= | = ^= lt;lt;= gtgt;=

其他运算符:[]()-gt;,new delete new[]delete[]-gt;*

不是所有C++语言中已有的运算符都可以重载,重载运算符是不允许的。*::?并且:

重载一个运算符时,不能改变操作数的个数、运算符的原优先级、运算符的原组合、运算符的原语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符,重载运算符的含义必须明确无误。

示例:通过重载运算符求和:

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:CBook(int iPage){m_iPage=iPage;}CBook operator+(CBook b){return CBook(m_iPage+b.m_iPage);}void display(){coutlt;lt;m_iPagelt;lt;endl;}protected:int m_iPage;};int main(void){CBook book1(10);CBook book2(20);CBook tmp(0);tmp=book1+book2;tmp.display();}

在类CBook重载sum操作符后,它声明的两个对象book1和book2可以作为两个整数变量添加。


3.重载运算符的运算

重载操作符后,就可以完成对象之间的操作,对象与常见类型数据之间的操作也可以通过重载操作符来实现。例如:

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:int m_Pages;void OutputPage(){coutlt;lt;m_Pageslt;lt;endl;}CBook(){m_Pages=0;}CBook operator+(const int page){CBook book;book.m_Pages=m_Pages+page;return book;}};int main(void){CBook Book1,Book2;Book2=Book1+10;Book2.OutputPage(); }

通过将运算符的参数改为整数类型,可以实现CBook对象和整数的相加。

对于两个整数变量的加法,可以改变加数和被加数的顺序,因为加法符合交换律。但是,对于由重载运算符实现的加法,不能交换顺序。

非法:

Book2=10+Book1;//非法代码

至于++和--运算符,由于涉及到前运算和后运算,重载这些运算符时如何区分?默认情况下,如果重载运算符没有参数,则意味着它是前置运算,例如:

void operator++()//前置运算 {++m_Pages;}

如果重载运算符使用整数作为参数,则意味着后运算,此时可以忽略参数值。它只是一个标识符,用于标识后期操作。

void operator++(int)//后置运算 {++m_Pages;}

默认情况下,将整数赋给对象是非法的,可以通过重载运算符使之合法。例如:

void operator = (int page){//重载运算符 m_Pages=page;}

还可以通过重载运算符将整数复制到对象中,例如:

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:int m_Pages;void OutputPages(){coutlt;lt;m_Pageslt;lt;endl;}CBook(int page){m_Pages=page;}operator = (const int page){m_Pages=page;}}; int main(void){CBook mybook(0);mybook = 100;mybook.OutputPages();}

程序重载赋值操作符,给mybook对象赋值100,并通过OutpuName()函数输出。

还可以通过重载构造函数将整数赋给对象。

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:int m_Pages;void OutputPages(){coutlt;lt;m_Pageslt;lt;endl;}CBook(){}CBook(int page){m_Pages=page;}}; int main(void){CBook mybook;mybook = 100;mybook.OutputPages();}

程序定义了一个重载的构造函数,以一个整数作为函数参数,可以将一个整数赋给一个CBook类的对象,语句mybook = 100;将调用构造函数CBook(int page)来重构一个CBook对象,并将其赋给mybook对象。


4.转义运算符

C++语言中的常见数据类型可以进行强制类型转换,例如:

int i=10;double d;d = double(i)

在程序中,整数I被强制加倍。

句子

d=double(i)//等同于d=double(i)

Double()在C++语言中转换为转换运算符。通过重载转换运算符,可以将类对象转换为所需的数据。

示例:转换运算符

#includelt;bits/stdc++.hgt;using namespace std;class CBook{public:CBook(double iPage=0);operator double(){return m_iPage;}protected:int m_iPage;}; CBook::CBook(double iPage){m_iPage = iPage;}int main(void){CBook book1(10.0);CBook book2(20.00);coutlt;lt;double(book1)+double(book2)lt;lt;endl;}

程序重载转换操作符double(),然后将类CBook的两个对象强制转换为double类型,然后对它们求和,最后输出求和结果。


总结

本文到此为止。希望能帮到你,也希望你能多多关注

0

精彩评论

暂无评论...
验证码 换一张
取 消