运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。

运算符重载实质上是函数的重载

重载运算符的函数一般格式如下:

函数类型    operator  运算符名称    (形参表列)

{对运算符的重载处理}

例如,想将“+”用于Complex(复数)的加法运算,函数的原型可以是这样的:

Complex operator + (Complex & c1,Complex &c2);

其中,operator是关键字,时候专门用于定义重载运算符的函数的,运算符名称就是C++提供给用户的预定运算符。

注意:函数名是由operator和运算符组成。

上面的operator+就是函数名,意思是“对运算符+重载“。只要掌握这点,这可以发现,这类函数和其他函数在形式上没有什么区别。

两个形参是Complex类对象的引用,要求实参为Complex类对象。

在定义了重载运算符后,可以说:函数operator+重载了运算符+。

在执行复数相加的表达式c1+c2时(假设c1+c2都已被定义为Complex),系统就会调用operator+函数,把c1+c2作为实参,与形参进行虚实结合。

为了说明把运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象称为调用下面的函数:

int operator + (int a,int b)
{
return (a+b);
}

如果有表达式5+8,就调用此函数,将5和8作为调用函数时的形参,函数的返回值为13,这就是通过函数的方法理解运算符。

=====================示例代码1.1==================================

#include<iostream>
using namespace std;
class Complex
{
public:
Complex()
{
real=0;
imag=0;
}
Complex(double r,double i)
{
real=r;
imag=i;
}
Complex operator + (Complex &c2);//声明运算符的"+"函数
void display();
private:
double real;
double imag;
};
Complex Complex::operator+(Complex &c2)
{
Complex c;
c.real=real+c2.real;
c.imag=imag+c2.imag;
return c;
}
void Complex::display()
{
cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main()
{
Complex c1(3,4),c2(5,-10),c3;
c3=c1+c2;
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
cout<<"c3=";
c3.display();
return 0;
}

分析:

在main函数中,“c3=c1+c2;”在将运算符+重载为类的成员函数后,C++编译系统将程序中的表达式c1+c2解释为:

c1.operator+(c2);//其中c1+c2是Complex类的对象

即以c2为实参调用c1的运算符重载函数operator+(Complex & c2),进行求值,得到两个复数之和。上面的“operator+”是一个函数名,它是类Complex的成员函数。

在实际工作中,类的声明和类的使用往往是分离的。假如在声明Complex类时,对运算符+,-,*,/都进行了重载,那么使用这个类的用户在编程时可以完全不考虑函数是怎么实现的,

放心大胆地直接使用+,-,*,/进行复数的运算即可,显然十分方便。

对上面的运算符重载函数operator +还可以改写的更简练一些:

Complex Complex::operator+(Complex &c2)
{
return Complex(c2.real+real,c2.imag+imag);
}

return语句中的Complex(c2.real+real,c2.imag+imag)是建立一个临时对象,它没有对象名,是一个无名对象。

在建立临时对象过程中,调用构造函数。return语句将此临时对象作为函数返回值。

那么,我们将+运算符进行了重载以后,可否将一个常量和一个复数相加呢?比如:

c3=3+c2;        //错误,与形参类型不匹配

这是行不通的,因为我们定义operator +函数的时候,形参是两个Complex的对象,也就是说,实参和形参匹配才可以调用函数。

应写成对象形式,如:

c3=Complex(3,0)+c2;     //正确,类型均为对象

还需要说明的是:运算符被重载后,其原有的功能仍然保留,没有丧失或改变。

例如,运算符+被重载以后,仍然可以用于int,float,double,char类型数据的运算,同时又增加了用于复数相加的功能。

编译系统根据表达式的上下文,即根据运算符两侧(如果是单目运算符则为一侧)的数据类型决定的。

如,对于3+5,则执行整数加法;对于3.4+5.45,则执行双精度数加法;对于两个复数类相加,则执行复数加法。

C++运算符重载的方法的更多相关文章

  1. C++学习之路—运算符重载(一)概念、方法及规则

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 1    什么是运算符重载 先来说下什么是重载吧 ...

  2. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  3. Python全栈工程师(异常(高级)、运算符重载)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr ...

  4. Pthon魔术方法(Magic Methods)-运算符重载

    Pthon魔术方法(Magic Methods)-运算符重载 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Python运算符对应的魔术方法 1>.比较运算符 <: ...

  5. C++程序设计方法3:数组下标运算符重载

    数组下标运算符重载 函数声明形式 返回类型operator[](参数): 如果返回类型是引用,则数组运算符调用可以出现在等式的左边,接受赋值,即: Obj[index] = value; 如果返回类型 ...

  6. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  7. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  8. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  9. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

随机推荐

  1. USACO Arithmetic Progressions 【构造等差数列】

    USER: Jeremy Wu [wushuai2] TASK: ariprog LANG: C++ Compiling... Compile: OK Executing... Test 1: TES ...

  2. double 型变量的输入输出标准格式

    c语言double型变量标准输入格式: scanf("%lf",num); 标准输出格式: printf("%f\n",num); 注:有过输出用%lf输出OJ ...

  3. WPF中StringFormat 格式化 的用法

    原文 WPF中StringFormat 格式化 的用法 网格用法 <my:DataGridTextColumn x:Name="PerformedDate" Header=& ...

  4. Python 做过哪些有趣的项目

          1 icedx   241 天前 via Android   ♥ 1 考虑到Windows 下的类Alfred 软件都太傻逼 自己用PyQT 写了一个       2 crazyxin19 ...

  5. What’s New in Python 2.7 — Python 3.4.0b2 documentation

    What's New in Python 2.7 - Python 3.4.0b2 documentation What's New in Python 2.7¶

  6. nodejs--express开发个人博客(-)

    写完了入门笔记,开始进入开发阶段吧.基于上一节的内容,现在着手开发个人博客系统.先划分一下功能吧 /:首页 /login:登陆 /reg:注册 /post:发表文章 /logout:退出 首先规划一下 ...

  7. WebView.destroy() called while still attached 的解决的方法

    能够如今webView的父组件中删除该webview,然后再Destroy parent.removeView(webView); 然后 webView.removeAllViews(); webVi ...

  8. struct 和 class 不同点

    在 C++ 里面 struct 和 class 没有本质的差别 仅仅是成员和继承方式的默认不同 struct 是 public class 是 private 我的个人建议是仅仅要须要实现成员函数的就 ...

  9. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  10. pop,墨刀,快现、justinmind 、Axure

    原型设计软件 墨刀:https://modao.cc Justinmind: http://www.zhihu.com/question/26662368/answer/33586218 http:/ ...