【学习】操作符重载

2018/8/21 15:16:56


何为操作符重载?

1. 操作符重载就是为了让原有操作符能够作用于用户定义的类型,例如‘+’操作符原来只能用于两侧均为数字或字符串的情况,通过操作符重载可以实现如两个时刻相加求和(类似11:20:00 + 1:25:20)。

 1 class Time(object):
 2     def __init__(self,hour=0,minute=0,second=0):
 3         self.hour = hour
 4         self.minute = minute
 5         self.hour = hour
 6     ...
 7     def __add__(self,other):
 8         ‘‘‘以下仅作示意用,未考虑进位‘‘‘
 9         hour = self.hour + other.hour
10         minute = self.minute + other.hour
11         second = self.second + other.second
12         print(‘%.2d:%.2d:%.2d‘ %(hour,minute,second))
13
14 start = Time(11,20)
15 end = Time(1,25,20)
16 ‘‘‘当运行+运算符会自动调用Time类中的__add__方法‘‘‘
17 start + end

以上对 ‘+‘ 运算符进行了重新的定义,让其能够对Time类进行操作,接下来再复杂一点。

2. 若左右两侧均为Time类,则按照上面方法计算;若其中右侧定为某时间间隔呢,这里就涉及到数据类型的判断。

 1 class Time(object):
 2     def __init__(self,hour=0,minute=0,second=0):
 3         self.hour = hour
 4         self.minute = minute
 5         self.second = second
 6     ...
 7     def __add__(self,other):
 8         ‘‘‘内置函数isinstance判断数据类型‘‘‘
 9         if isinstance(other,Time):
10             ‘‘‘类中调用类的函数不需要self参数‘‘‘
11             self.add_time(other)
12         if isinstance(other, int):
13            self.add_interval(other)
14     def add_time(self,other):
15         ‘‘‘以下仅作示意用,未考虑进位‘‘‘
16         hour = self.hour + other.hour
17         minute = self.minute + other.minute
18         second = self.second + other.second
19         print(‘%.2d:%.2d:%.2d‘ %(hour,minute,second))
20     def add_interval(self,other):
21         ‘‘‘以下仅作示意用,未考虑进位‘‘‘
22         hour = self.hour
23         minute = self.minute
24         second = self.second + other
25         print(‘%.2d:%.2d:%.2d‘ %(hour,minute,second))
26
27 start = Time(11,20)
28 end = Time(1,25,20)
29 ‘‘‘当运行+运算符会自动调用Time类中的__add__方法‘‘‘
30 start + end
31 >>>12:45:20
32 end1 = 20
33 ‘‘‘当运行+运算符会自动调用Time类中的__add__方法‘‘‘
34 start + end1
35 >>>11:20:20

3.总结

以上介绍了操作符重载的基本用法,实际的用法会有更多。以下链接列出支持操作符重载的操作符以及其在类中所对应方法的名称(必须严格按照__X__的格式,否则无法识别)

https://www.cnblogs.com/jessonluo/p/4742148.html

原文地址:https://www.cnblogs.com/i-orange/p/9512025.html

时间: 2024-10-08 11:31:37

【学习】操作符重载的相关文章

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、>>和<<运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳、operator new 和 operator delete 实现一个简单内存泄漏跟踪器

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳.operator new 和 operator delete 实现一个简单内存泄漏跟踪器 一.转换构造函数 可以用单个实参来调用的构造函数定义从形参类型到该类型的一个隐式转换.如下: class Integral { public: Integral (int = 0); //转换构造函数 private: int real; }; Integral A = 1; //调用转换构造函数将1转换为In

C++语言学习(八)——操作符重载

C++语言学习(八)--操作符重载 一.操作符重载基础 1.操作符重载的语法 通过operator关键字可以定义特殊的函数,operator本质是通过函数重载操作符. Type operator operatorname(const Type p1, const Type p2) { Type ret; return ret; } 2.友元函数重载操作符 可以将操作符重载函数声明为友元函数. #include <iostream> using namespace std; class Comp

C++学习笔记-操作符重载

操作符重载(operator overloading)是一种形式的C++多态,C++将操作符重载扩展到用户自定义的类型,如允许使用+将两个自定义的对象相加,编译器将根据操作数的数目和类型决定使用那种加法定义. 要重载操作符,需使用操作符函数,格式如下: operator op (argument-list) op:要重载的操作符 argument-list: 操作数 操作符函数可以是类的成员函数,也可以是友元函数,如果是类成员函数,则第一个操作数是调用对象,它不在argument-list中.

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我

5.7 C++函数调用操作符重载

参考:http://www.weixueyuan.net/view/6385.html 总结: 需要以类成员函数的形式对函数调用操作符"()"进行重载. 只有常成员函数才能处理常对象,故我们依然在类中提供两个版本的函数调用操作符重载函数.若调用对象为常对象(const),则必须用常函数. 这里面的关于在函数中抛出异常,在调用处捕捉异常,值得参考学习. 与下标操作符重载函数相同,我们同样需要以类成员函数的形式对函数调用操作符"()"进行重载.其声明语法只有一种形式: 

C++等号操作符重载

在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好new 与 delete.绝对不会有类似的问题. 当时我们编译可以通过,但是运行会出错,因为对象s1与s2进行赋值时,采用浅拷贝,导致对象析构时会对同一块内存空间析构两次.也就是说等号操作符“=”,默认是进行浅拷贝,我们需要对等号操作符进行重载,使其能够进行深拷贝. 同时要重载等号操作符支持链式编程,类如 s3 = s4 = s5;  //操作符使对象连载叠加,与上一篇的return *this 与 return