当前位置: 首页 > news >正文

C++运算符重载函数

运算符重载的函数

运算符重载的方法是定义一个“重载运算符的函数”,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数来实现的。运算符重载实际上就是函数的重载,这个函数称为:重载运算符函数

重载运算符函数一般格式如下:

函数返回类型 operator 运算符名称(形参列表)

{ 对运算符的重载处理 }

例如,想将加法运算符“+”用于my_string类的加法运算,函数的原型可以这样定义:

my_string& operator + (my_string &str);

在上面的一般格式中,operator 是关键字,是专门用于定义重载运算符的函数的。运算符名称就是C++提供给用户的预定义运算符。注意:函数名是由operator和运算符组成。上面的operator + 就是函数名,意思是“对运算符 + 重载”。

只要掌握这点,就可以发现,这类函数和其他函数在形式上没有什么区别。形参是my_string类对象的引用,要求实参为my_string类对象。

在定义了重载运算符的函数后,可以说:函数 operator + 重载了运算符+。在执行my_string相加的表达式,如下:

my_string str1, str2;

str1 + str2;

此时,相当于str1对象调用它的operate +() 函数,把str2作为参数,执行如下:

str1.operator+(str2);

那么,就是一个普通的对象调用函数。

可以修改前面的程序例子,在其基础上重载运算符“+”,使之用于my_string类对象相加。修改后的程序代码如下:

 程序运行结果如下:

可以看到,定义了str, str1字符串,然后,两个字符串相加,把结果赋给s对象。执行的操作如下:

s = str + str1;

在这个代码中,有如下的要点分析:

(1) str对象调用operator+()函数,把str1对象,作为参数来操作。相当于:

s = str.operator+(str1);

那么,str.operator+()函数调用完毕之后,返回值是一个my_string对象的引用。就是返回str对象的引用。

所以,s对象得到str与str1对象相加的结果。

编译器在编译到“str + str1;”语句的时候,发现str是my_string类,然后,后面接着一个“+”运算符,所以,就去my_string类寻找,发现重载了 operator + (); 函数,而且,这个函数是作为my_string类的成员函数(注意:后面还介绍了,重载的运算符作为友元函数的时候,不是属于当前类的成员函数,需要两个参数),所以,就调用:

my_string& my_string::operator + (my_string &str)

{

strcat(buf, str.buf);

return *this;

}

那么,对于“str + str1;”操作,就是str对象调用自己重载的operator + ( ); 成员函数来执行,其中,str1 作为参数,得到如下的调用结果:

str.operator +(str1);

在声明my_string类时,对运算符 + , - , * , / 都进行了重载,那么,使用这个类的用户在编程的时候完全不用考虑这个运算符重载函数是怎么样实现的,放心大胆地直接使用这些运算符进行操作,显然十分方便。

通过以上的例子,可以看到,重载运算符的明显好处。C++提供的运算符只能用于C++的标准类型数据的运算,但C++程序设计的重要基础是类和对象,允许用户自己定义新的类型。如果C++的运算符都无法用于类对象,对于类对象不能直接进行赋值运算,算术运算,关系运算,逻辑运算和输入输出操作,那么,类和对象的应用将受到很大的限制,影响类和对象的使用。

为了解决这个问题,使类和对象有更强的生命力,C++采取的方法不是为类对象另外定义一批新的运算符,而是允许重载现有的运算符。使这些类简单易用,众所周知的运算符也能直接应用于自己定义的类对象。通过运算符重载,扩大了C++已有运算符的作用范围,使之能用于类对象。所以,通过运算符的重载来解决这个问题。


韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发

相关文章:

  • 图解操作系统-cpu cache
  • 软件测试怎么去介绍一个项目的测试流程?
  • Redis实战篇一 (短信登录)
  • SpringBoot使用在控制层切面注解配置的方式将日志存储在mysql
  • 二叉树小记
  • 使用SpringBoot整合国产数据库连接池Druid
  • Servlet的一些操作
  • 设计模式 1 - 单例模式:附全套 Git 简洁代码
  • 模板·初阶
  • 【MATLAB教程案例30】基于MATLAB的图像阴影检测和消除算法的实现
  • 字符串拼接