5.运算符重载

5.1 在类外定义的运算符重载函数

C++为运算符重载提供了一种方法,即在运行运算符重载时,必须定义一个运算符重载函数,
其名字为operator,后随一个要重载的运算符。例如,要重载"+"号,应该写一个名字为operator
的函数,其他的运算符也是如此。
函数 功能
operator+ 加法
operator- 减法
operator* 乘法
operator< 小于

因此,若要两个对象相加,需要先定义一个运算符重载函数operator+,例如:

class Complex{
public:
double real,imag;
Complex(double r=;doubble i=)
{
real = r;
imag = i;
}
};
Complex operator+(Complex om1,Complex om2)
{
Complex temp;
temp.real = om1.real+om2.real;
temp.imag = om1.imag+om2.imag;
return temp;
}

这样,就可以方便使用语句:

 int main()
{
Complex com1(1.1,2.2),com2(3.3,4.4),total;
//total = com1+com2;
//total = operator+(com1,com2);
return ;
}
//上述两个注释语句是等价的,显然前者更简单明了。

//例5.1 两个Complex类对象相加的完整程序

#include<iostream>
using namespace std;
class Complex{
public:
double real,imag;
Complex(double r=,double i=)
{
real = r;
imag = i;
}
};
Complex operator+(Complex om1,Complex om2) //定义运算符+的重载函数
{
Complex temp;
temp.real = om1.real+om2.real;
temp.imag = om1.imag+om2.imag;
return temp;
}
int main(int argc, char** agrv)
{
Complex com1(1.1,2.2),com2(3.3,4.4),total1,total2;
total1 = com1+com2; //调用运算符重载函数operator的第一种方式
cout<<"total1.real="<<total1.real<<","<<"total1.imag="<<total1.imag<<endl;
total2 = operator+(com1,com2); //调用运算符重载函数operator的第二种方式
cout<<"total2.real="<<total2.real<<","<<"total2.imag="<<total2.imag<<endl;
return ;
}

C++对运算符重载指定如下一些规则:

(1)不允许重载的运算符有:
.(成员访问运算符) .*(成员指针访问运算符) ::(作用域符) Sizeof(长度运算符) ?:(条件运算符)

(2)不允许用户定义新的运算符作为重载运算符

(3)重载的功能应当与原有的功能相类似(+就是实现加法,-就是实现减法)

(4)重载不能改变运算符的操作对象(即操作数)。例如,"+"就是一个双目运算符(即只能代两个操作数),重载后仍为双目运算符,需要两个参数。

(5)重载不能改变运算符原有的优先级。但是可以采用加"()"的办法进行强制转换。

(6)重载不能改变运算符原有的结合特性.例如,乘除法运算符都是从左往右结合的.必要时,可以采用加"()"的办法

(7)运算符重载函数的参数至少应有一个是类对象(或类对象的引用)。也就是说,运算符重载函数的参数不能全是C++的标准型(基本数据类型)。目的是:防止用户修改标准类型数据的运算符性质。

(8)运算符重载函数可以是普通函数,也可以是类的成员函数,还可以是类的友元函数。

(9)一般而言,用于类对象的运算符必须重载,但是赋值运算符"="除外,不必用户进行重载,系统已经为每一个新声明的类重载了一个赋值运算符函数,它的作是逐个复制类的数据成员,可以直接用于对象之间的赋值,用户不必自己编写运算符重载函数。

C++:运算符重载函数的更多相关文章

  1. C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用

    5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...

  2. C++:成员运算符重载函数和友元运算符重载函数的比较

    5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...

  3. C++:运算符重载函数之成员运算符重载函数

    5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...

  4. C++:运算符重载函数之友元运算符重载

    5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算 ...

  5. C++:友元运算符重载函数

    运算符重载函数:实现对象之间进行算数运算,(实际上是对象的属性之间做运算),包括+(加号).-(减号).*./.=.++.--.-(负号).+(正号) 运算符重载函数分为:普通友元运算符重载函数.成员 ...

  6. C++ 类型转化(运算符重载函数)和基本运算符重载(自增自减)

    类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据).在C ...

  7. 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数

        C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁  //站点:www.cn ...

  8. 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态

        C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...

  9. swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)

    swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...

随机推荐

  1. Delphi 中的全局快捷键+给指定窗体发送按键

    [背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...

  2. 删除mysql的root用户恢复方法

    1.# service mysqld stop                             #停止mysql数据库服务Shutting down MySQL.. SUCCESS! 2.# ...

  3. 【转载】MySQL 日志 undo | redo

    本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...

  4. 关于php框架

    最近学习yii2.0 强哥原班人马开发,不得不看 同时也需要关注一下drupal8和symfony2

  5. NSStringDrawingOptions-b

    如果options参数为NSStringDrawingUsesLineFragmentOrigin,那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸.(在这里有点奇怪,因为字体高度大概是13.8 ...

  6. android studio出现 waiting for adb

    cmd进入命令行,进入adb所在的目录下: 出现的鬼异问题如下. C:\Users\xxxx>adb start-server adb server is out of date. killin ...

  7. web.xml中servlet的配置

    <servlet>元素是配置Servlet所用的元素. <servlet-mapping>元素在Servlet和URL样式之间定义一个映射,即servlet类提供一个url,在 ...

  8. Microsoft SQLServer有四种系统数据库

    Microsoft SQLServer有四种系统数据库: 1.master数据库 master数据库记录SQLServer系统的所有系统级别信息.它记录所有的登录帐户和系统配置设置.master数据库 ...

  9. C++ explict 关键字

    关键字explicit可以禁止“单参数构造函数”被用于自动类型转换class Stack{explicit Stack(int size);};没有explicit的话Stack s = 40;能编译 ...

  10. Unity3D研究院之与Android相互传递消息

    原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...