C++的运算符重载

转载 2011年01月25日 21:36:00

C++的运算符重载

 

   

 

 运算符重载时要遵循以下规则:

(1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。

(
2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

(
3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

(
4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

(
5) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。

(
6) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

  运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载。但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)   

成员函数运算符

 运算符重载为类的成员函数的一般格式为:

    
<函数类型> operator <运算符>(<参数表>)

    
...{

     
<函数体>

    }

  当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:

(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

(
2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

(
3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

    调用成员函数运算符的格式如下:

    
<对象名>.operator <运算符>(<参数>)

    它等价于

    
<对象名><运算符><参数>

    例如:a
+b等价于a.operator +(b)。一般情况下,我们采用运算符的习惯表达方式。

友元函数运算符

 运算符重载为类的友元函数的一般格式为:

    friend 
<函数类型> operator <运算符>(<参数表>)

    
...{

     
<函数体>

    }

  当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

 调用友元函数运算符的格式如下:

    
operator <运算符>(<参数1>,<参数2>)

    它等价于

    
<参数1><运算符><参数2>

    例如:a
+b等价于operator +(a,b)。

两种重载形式的比较

  在多数情况下,将运算符重载为类的成员函数和类的友元函数都是可以的。但成员函数运算符与友元函数运算符也具有各自的一些特点:

(1) 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

(
2) 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->

(
3) 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。

(
4) 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。

(
5) 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。

(
6) 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一 个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。

(
7) 当需要重载运算符具有可交换性时,选择重载为友元函数。

 

<返回类型说明符> operator <运算符符号>(<参数表>)
...{

     
<函数体>

}
  C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 

  运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结。 一、何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以...
  • uestclr
  • uestclr
  • 2016年04月16日 21:59
  • 3272

C++基础篇--运算符重载

运算符重载没有多高深复杂,但牵扯到的相关概念和语法变化不少,如果这块基石不牢固,读复杂C++代码时就只有雾里看花的份。 运算符重载由来     C/C++中所有运算符(+-*/等)默认只用于基本数据类...
  • ipmux
  • ipmux
  • 2015年09月01日 15:04
  • 984

C++_运算符重载_前缀自增与后缀自增

由于前缀自增与后缀自增在如果通过运算符重载在形式上相同,都为 以Date类为例 Date& operator++(Date &)(全局函数)/ Date& operator++( )(成员函数)无法区...
  • u010003835
  • u010003835
  • 2015年08月06日 18:16
  • 2764

【C++面向对象】C++中运算符重载的两种方式

我们知道在C++中可以通过重载运算符的方式,使类实现类似于基本类型的运算符操作,如+、-、*、/等等。本文介绍这种重载运算符的两种方法。 我们先自定义一个类,来作为本次研究的对象: class I...
  • lzhui1987
  • lzhui1987
  • 2016年10月28日 11:21
  • 3389

c++简单几种运算符重载

简单介绍几种运算符重载c++的类中有最基本的“六大少”: 构造函数,拷贝构造函数,赋值语句,析构函数,取地址运算符重载和const修饰的取地址运算符重载,接下来进行简要的说明(我们以Test类为主)...
  • angry_youth
  • angry_youth
  • 2017年03月20日 18:55
  • 961

C++实践参考——分数类中的运算符重载

【项目1-分数类中的运算符重载】   (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。class CFraction { private: ...
  • sxhelijian
  • sxhelijian
  • 2016年05月19日 21:44
  • 3255

C++回顾之前置++、后置++、不等号!及赋值运算符重载

关于前置++,后置++,非(不等号)运算符及赋值运算符的重载
  • ab198604
  • ab198604
  • 2014年02月24日 16:44
  • 8702

【C++】强制类型转换运算符的重载

#include #include using namespace std; class MyCin {     bool bStop;     public:         My...
  • u012261044
  • u012261044
  • 2014年06月07日 10:28
  • 1016

C++中的运算符重载-1

1. 运算符重载介绍 之前的函数重载,允许多个同名不同参数类型的函数; 运算符重载允许程序员如何使用运算符(如+、-、==、=和!)来处理不同类型的数据类型; 对于基本数据类型,运算...
  • SMF0504
  • SMF0504
  • 2016年05月11日 21:36
  • 425

C++ STL 基础及应用(2) 模板与操作符重载

模板是 C++ 语言中重要的概念。它提供了一种通用的方法来开发重用的代码,即以创建参数化的 C++ 类型。 本章将阐述一些具体的 STL 模板思想,并简单介绍操作符重载与模板的联系。 文中将给出一个简...
  • Raito__
  • Raito__
  • 2016年05月22日 17:13
  • 2671
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++的运算符重载
举报原因:
原因补充:

(最多只允许输入30个字)