5.2.3 成员运算符重载函数

在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数。

1. 定义成员运算符重载函数的语法形式
(1)在类的内部,定义成员运算符重载函数的格式如下:
函数类型 operator 运算符(形参表)
{
       函数体
}

(2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义。

在类的内部,声明成员运算符重载函数原型的格式如下:
class X{
      ...
      函数类型 operator运算符(参数表);
};
在类的外部定义,定义成员运算符重载函数原型的格式如下:
函数类型 operator运算符(参数表)
{
      函数体
}

其中,X是友元函数的运算符重载函数所在类的类名;函数类型指定了成员运算符函数的返回值类型;operator是定义运算符重载函数的关键字;运算符即是要重载的运算符名称,必须是C++中可重载的运算符;形参表中给出重载运算符所需要的参数和类型。由于成员运算符重载函数是该类的成员函数,所以在类外定义时必须缀上类名。

注意:在成员运算符重载函数的形参表中,若运算符是单目的,则参数表为空;若运算符是双目的,则参数表中有一个操作数。

2. 双目运算符重载

对双目运算符而言,成员运算符重载函数的形参表中仅有一个参数,它作为运算符的右操作数。另一个操作数(左操作数)是隐含的,是该类的当前对象,它是通过this指针隐含地传递给函数的。例如

calss X{
       ...
       int operator+(X a);
       ...
};
在类中声明重载"+"的成员运算符重载函数,返回类型为int,它具有两个操作数,一个是当前对象,另一个是类X的对象a。

例5.5 用成员运算符重载函数进行复数的运算。
加法:(a+bi)+(c+di)=(a+c)+(b+d)i
减法:(a-bi)+(c-di)=(a-c)+(b-d)i
乘法:(a-bi)*(c-di)=(ac-bd)+(ad+bc)i
除法:(a-bi)/(c-di)=(a+bi)*(c-di)/(c*c+d*d)

#include<iostream>
using namespace std;
class Complex{
public:
Complex(){};
Complex(double r,double i)
{
real = r;
imag = i;
}
void print();
Complex operator+(Complex co); //声明运算符+的重载函数
Complex operator-(Complex co); //声明运算符-的重载函数
Complex operator*(Complex co); //声明运算符*的重载函数
Complex operator/(Complex co); //声明运算符/的重载函数
private:
double real;//复数的实部
double imag;//复数的虚部
};
Complex Complex::operator+(Complex co) //定义运算符+的重载函数
{
Complex temp;
temp.real = real+co.real;
temp.imag = imag+co.imag;
return temp;
}
Complex Complex::operator-(Complex co) //定义运算符-的重载函数
{
Complex temp;
temp.real = real-co.real;
temp.imag = imag-co.imag;
return temp;
}
Complex Complex::operator*(Complex co) //定义运算符*的重载函数
{
Complex temp;
temp.real = real*co.real-imag*co.imag;
temp.imag = real*co.imag+imag*co.real;
return temp;
}
Complex Complex::operator/(Complex co) //定义运算符/的重载函数
{
Complex temp;
double t;
t = /(co.real*co.real+co.imag*co.imag);
temp.real = (real*co.real+imag*co.imag)*t;
temp.imag = (co.real*imag-real*co.imag)*t;
return temp;
}
void Complex::print()
{
cout<<real;
cout<<"+"<<imag<<'i'<<endl;
}
int main()
{
Complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6;
A3 = A1+A2; //A3 = A1.operaotr+(A2)
A4 = A1-A2; //A3 = A1.operaotr-(A2)
A5 = A1*A2; //A3 = A1.operaotr*(A2)
A6 = A1/A2; //A3 = A1.operaotr/(A2)
A1.print();
A2.print();
A3.print();
A4.print();
A5.print();
A6.print();
return ;
}
/*
一般而言,如果在类X中采用成员函数重载双目运算符@,成员运算符函数operator@所需要的
一个操作数由对象aa通过this指针隐含地传递,它的另一个操作数bb在参数表中显示,则以下
两种函数调用方法是等价的。 aa@bb; //隐式调用
aa.operator@(bb); //显示调用
*/

3. (成员运算符重载函数)单目运算符重载

对单目运算符而言,成员运算符重载函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。

//例5.6 用成员函数重载单目运算符"++"

#include<iostream>
using namespace std;
class Coord{
public:
Coord(int i=,int j=)
{
x = i;
y = j;
}
Coord operator++(); //声明成员运算符++重载函数
//void operator++();
void print();
private:
int x,y;
};
Coord Coord::operator++() //定义成员运算符++重载函数
{
++x;
++y;
return *this; //返回当前对象的值
}
/*
void Coord::operator++()
{
++x;
++y;
}
*/
void Coord::print()
{
cout<<"x="<<x<<","<<"y="<<y<<endl;
}
int main()
{
Coord c(,);
c.print(); ++c; //隐式调用
c.print(); c.operator++(); //显示调用
c.print(); return ;
}
/*
本例中主函数中调用成员运算符重载函数operator的两种方式是等价的。
即 ++c ========== c.operator++() 其格式为: @aa; //隐式调用
aa.operator(); //显示调用 从本例中还可以看出,当用成员函数重载单目运算时,没有参数被显示地传递给成员运算符
。参数是通过this指针隐含地传递给函数 */

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

  1. 003-Python3-基础语法-运行方式、代码基础要求、运算符[算数运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符]、运算符优先级

    一.基础语法 参看地址:https://www.runoob.com/python3/python3-tutorial.html 1.1.运行方式 1.文件方式 编写一个hello.py文件, pri ...

  2. day02五大运算符:逻辑运算符、成员运算符、算数、比较、赋值、

    # -*- encoding: utf-8 -*-# print('hello 中国')# 变量# print(10 + 20 + 3 + 15)# print((10 + 20 + 3 + 15)* ...

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

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

  4. C++重载(主要介绍使用友元函数重载)

    重载限制 多数C++运算符都可以用下面的方式重载.重载的运算符不必是成员函数,但必须至少有一个操作数是用户自定义的类型.下面详细介绍C++对用户定义的运算符重载的限制. 1 重载后的运算符必须至少有一 ...

  5. Python3入门系列之-----算术运算符|比较运算符|赋值运算符|逻辑运算符|成员运算符|身份运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 1 +2 = 3 . 例子中,1 和 1.2 被称为操作数,"+" 称为运算符. Python语言支持以下类型的 ...

  6. 7. Python运算符之逻辑、成员、身份运算符及优先级

    运算符 逻辑表达式 描述 and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值. or x or y 布尔& ...

  7. C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...

  8. C++ Pirmer : 第十四章 : 重载运算符与类型转换之函数调用运算符与标准库的定义的函数对象

    函数调用运算符 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所谓的函数调用就是一个类重 ...

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

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

随机推荐

  1. Hibernate 插入,修改,删除,查询语句

    /* *具体操作hibernate的类 *增加,删除,修改,按ID查询,模糊查询,查询全部 **/ public class PersonOperate { //在hibernate中所有操作都是由S ...

  2. IE下同样的$.ajax()被调用两次,只能执行一次(第一次)

    今天发现了这个问题,仅限于IE下所有浏览器包括Edge 百度了一下原来问题就在这句话:如果第二次请求与第一次请求完全相同,会直接从缓存获取. 那么就在请求时让URL变得不一样吧 $.ajax({ ty ...

  3. JSON对象配合jquery.tmpl.min.js插件,手动攒出一个table

    jquery.tmpl.min.js 首先下载这个插件 1.绑定json那头的键 //TemplateDDMX 这个是这段JS的ID,这个必须写!!!!!! //${}为json的键的值,必须要填写正 ...

  4. 有关UIView、subview的几个基础知识点-IOS开发 (实例)

    环境是xcode4.3 首先要弄懂几个基本的概念. 一)三个结构体:CGPoint.CGSize.CGRect 1.  CGPoint /* Points. */ struct CGPoint { C ...

  5. matlab实现插值法sin函数

    插值法实现sin函数: %calculate and print the sine function %input: x %output: sin(x) similar function y = si ...

  6. iTween基础之Move(移动)

    1,五种移动方法:2, 函数的基础属性及用法 原文地址:http://blog.csdn.net/dingkun520wy/article/details/50476864 iTween官网:http ...

  7. VBS基础篇 - 常量

    常量:指的是在程序运行过程中其值保持不变的量,它用来保存固定不变的数值,字符串等常数 . 常量的定义:在vbscript中使用使用 Const 指令可以创建名称具有一定含义的字符串型或数值型常量,并给 ...

  8. SQL语言笔记

      字符串用单引号',判断用单等号=,两个单引号''转义为一个单引号' 不等号是<> 不区分大小写 []括起来的要不是关键字,要不是非法变量,比如空格隔起来的变量   创建与删除数据库 - ...

  9. python学习之“切片操作从入门到精通”

    在python学习开发的过程中,我们总是不断的要对List(列表),Tuple(元组)有取值操作:假如我们有一个列表List1现在想取出1其中的前5个元素,改怎么操作呢? >>> L ...

  10. 【BZOJ】【1877】【SDOI2009】晨跑

    网络流/费用流 费用流入门题……根本就是模板题好吗! 拆点搞定度数限制,也就是每个点最多经过一次……源点汇点除外. /***************************************** ...