成员运算符重载函数

成员运算符重载函数,即把运算符重载函数定义为某个类的成员函数。

1、定义成员运算符重载函数的语法形式

(1)在类的内部,定义成员运算符重载函数的格式如下:

函数类型 operator 运算符(形参表){函数体
}

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

在类内,声明成员运算符重载函数原型的格式如下:

class X{函数类型 operator 运算符(形参表);
}

在类外,定义成员运算符重载函数的格式如下:

函数类型 X::operator 运算符(形参表){函数体
}

operator 是定义运算符重载函数的关键字;
运算符即是要重载的运算符名称,必须是 C++中可重载的运算符;
由于成员运算符重载函数是该类的成员函数,所以在类外定义时需要缀上类名。

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

2、双目运算符重载

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

class X{```int operator+(X a);```
}

  在类 X 中声明了重载 “+” 的成员运算符重载函数,返回类型为 int ,它具有两个操作数,一个是当前对象,另一个是类 X 的对象 a。

例 1:用成员运算符重载函数进行复数运算。

#include<iostream>
using namespace std;
class Complex{private:double real;double imag;public:Complex(double r=0.0,double i=0.0);      //构造函数void print();     //显示输出复数Complex operator+(Complex c);      //声明运算符 "+" 重载函数Complex operator-(Complex c);        //声明运算符 "-" 重载函数Complex operator*(Complex c);     //声明运算符 "*" 重载函数Complex operator/(Complex c);     //声明运算符 "/" 重载函数
};
Complex::Complex(double r,double i){  //构造函数 real=r;imag=i;
}
void Complex::print(){      //显示复数的实数和虚数部分 cout<<real;if(imag>0)cout<<"+";if(imag!=0)cout<<imag<<'i'<<endl;
}
Complex Complex::operator+(Complex c){     Complex temp;temp.real=real+c.real;temp.imag=imag+c.imag;return temp;
}
Complex Complex::operator-(Complex c){      Complex temp;temp.real=real-c.real;temp.imag=imag-c.imag;return temp;
}
Complex Complex::operator*(Complex c){      Complex temp;temp.real=real*c.real-imag*c.imag;temp.imag=real*c.imag+imag*c.real;return temp;
}
Complex Complex::operator/(Complex c){      Complex temp;double t;t=1/(c.real*c.real+c.imag*c.imag);temp.real=(real*c.real+imag*c.imag)*t;temp.imag=(c.real*imag-real*c.imag)*t;return temp;
}
int main(){Complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6;A3=A1.operator+(A2);A4=A1-A2;A5=A1*A2;A6=A1/A2;A1.print();A2.print();A3.print();A4.print();A5.print();A6.print();return 0;
}

执行结果:

其中,

A3=A1+A2;

C++ 将其解释为:

A3=A1.operator+(A2);

   一般而言,如果在类 X 中采用成员函数重载双目运算符@,成员运算符函数 operator@ 所需的一个操作数由对象 aa 通过 this 指针隐含地传递,它的另一个操作数 bb 在参数表中显示,则以下两种函数调用方法是等价的:

aa@bb;      //隐式调用
aa.operator@(bb);      //显式调用

3、单目运算符重载

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

例 2:用成员函数重载单目运算符“++”

#include<iostream>
using namespace std;
class Coord{private:int x,y;public:Coord(int i=0,int j=0);void print();Coord operator++();
};
Coord::Coord(int i,int j){x=i;y=j;
}
void Coord::print(){cout<<"x:"<<x<<",y="<<y<<endl;
}
Coord Coord::operator++(){        //定义运算符++重载函数 operator++ ++x;++y;return *this;  //返回当前对象的值
}
int main(){Coord ob(10,20);ob.print();++ob;ob.print();ob.operator++();ob.print();return 0;
}

执行结果:

  本例中主函数 main 中调用成员运算符重载函数 operator++ 的两种方式,

++ob;

ob.operator++();

是等价的,其执行效果相同。

  一般而言,采用成员函数重载单目运算符时,以下两种方法是等价:

@aa;    //隐式调用
aa.operator@();        //显式调用

运算符重载之成员运算符重载相关推荐

  1. (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则

    文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...

  2. [C]成员运算符.和间接成员运算符-浅析

    成员运算符: . 成员运算符一般和结构或者联合名一起使用,指定结构或者联合中的某个成员. 举个栗子: 如果Ronz是一个结构的名称,linux是这个结构模板指定的一个成员名. 1 struct{ // ...

  3. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

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

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

  5. python中的成员运算符用于判断什么_Python之运算符

    原标题:Python之运算符 这章我们介绍如何用Python的运算符,大家不懂的地方可以加群:579817333咨询学习 Python运算符包括赋值运算符.算术运算符.关系运算符.逻辑运算符.位运算符 ...

  6. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

  7. 重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符...

    一.基本概念 重载的运算符时具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.和其他函数一样,重载的运算符也包含返回类型.参数列表以及函数体. 重载运算符函数的参数 ...

  8. C++运算符重载(成员函数方式)

    一.运算符重载 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样 ...

  9. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符

    成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...

最新文章

  1. Linux 运维故障排查思路,有这篇文章就够了
  2. UTF-8和BOM的一些说明
  3. hbase filter原理_HBase应用|HBase在移动广告监测产品中的应用
  4. JavaScript全局变量的本质及页面共享问题
  5. Google地球查看香港地形
  6. Tensorflow——Tensorboard可视化
  7. 10月24日云栖精选夜读:2017杭州·云栖大会完美收官 虚拟化平台精彩回顾
  8. ubuntu 16.04 + zabbix 3.4 + postgresql shell
  9. shell有bool运算么_Windows Powershell条件表达式之条件操作符
  10. 华为NP课程笔记22-防火墙
  11. 采用ATSC标准、欧洲DVB-T和日本ISDB-T标准的国家
  12. onenote 导出为 html,Exporting or convert OneNote 2010 to HTML, not MHTML
  13. PulseAudio安装流程
  14. JavaScript 实现延迟合并处理任务
  15. dcs常用的冗余方式_冗余技术在DCS平台应用分析
  16. 全面替代Microsoft Office、Microsoft visio和WPS的优秀开源文档编辑器LibreOffice
  17. excel单元格斜线_最实用的8个Excel操作技巧,1分钟学会!
  18. 一个炫酷的opengles2.0翻页效果(安卓上opengles2.0 翻书效果附源码)
  19. [转载]HC-SR501 人体红外感应模块
  20. 吉林大学单片机实验课实验五——重量测量

热门文章

  1. 解决“jupyter导出图片怎么是空白的”
  2. Kafka消费者无法消费数据,解决
  3. javascript AES加密及解密
  4. JAVA方法和本地方法
  5. 20种有效改善肠道健康的科学方法
  6. 《英雄联盟》手机版将由光子负责?能超越天美《王者荣耀》吗?
  7. 滴滴出行基于RocketMQ的改造分享(转)
  8. android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能
  9. 荣耀平板对比测评 用过才知道原来这么香
  10. 坚果U2Pro怎么样好不好,这篇都告诉你