C++:运算符重载函数
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++:运算符重载函数的更多相关文章
- C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用
5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...
- C++:成员运算符重载函数和友元运算符重载函数的比较
5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...
- C++:运算符重载函数之成员运算符重载函数
5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...
- C++:运算符重载函数之友元运算符重载
5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算 ...
- C++:友元运算符重载函数
运算符重载函数:实现对象之间进行算数运算,(实际上是对象的属性之间做运算),包括+(加号).-(减号).*./.=.++.--.-(负号).+(正号) 运算符重载函数分为:普通友元运算符重载函数.成员 ...
- C++ 类型转化(运算符重载函数)和基本运算符重载(自增自减)
类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据).在C ...
- 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数
C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁 //站点:www.cn ...
- 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态
C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...
- swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)
swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...
随机推荐
- Delphi 中的全局快捷键+给指定窗体发送按键
[背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...
- 删除mysql的root用户恢复方法
1.# service mysqld stop #停止mysql数据库服务Shutting down MySQL.. SUCCESS! 2.# ...
- 【转载】MySQL 日志 undo | redo
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- 关于php框架
最近学习yii2.0 强哥原班人马开发,不得不看 同时也需要关注一下drupal8和symfony2
- NSStringDrawingOptions-b
如果options参数为NSStringDrawingUsesLineFragmentOrigin,那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸.(在这里有点奇怪,因为字体高度大概是13.8 ...
- android studio出现 waiting for adb
cmd进入命令行,进入adb所在的目录下: 出现的鬼异问题如下. C:\Users\xxxx>adb start-server adb server is out of date. killin ...
- web.xml中servlet的配置
<servlet>元素是配置Servlet所用的元素. <servlet-mapping>元素在Servlet和URL样式之间定义一个映射,即servlet类提供一个url,在 ...
- Microsoft SQLServer有四种系统数据库
Microsoft SQLServer有四种系统数据库: 1.master数据库 master数据库记录SQLServer系统的所有系统级别信息.它记录所有的登录帐户和系统配置设置.master数据库 ...
- C++ explict 关键字
关键字explicit可以禁止“单参数构造函数”被用于自动类型转换class Stack{explicit Stack(int size);};没有explicit的话Stack s = 40;能编译 ...
- Unity3D研究院之与Android相互传递消息
原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...