C#编程(四十)----------运算符重载
运算符重载
所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力.
例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和.
int i=5,j=4;
int sum = i+j;
如果可以使用代表附属的用户定义的类型来编写相同类型的表达式,那当然是最好不过的了:
Complex i=5;
Complex sum=i+j;
运算符重载允许为用户定义的类型重载(即指明明确的含义)诸如”+”这样的运算符.如果不进行重载,则用户需要编写以下代码:
Complex i= new Complex();
Complex j= new Complex();
Complex sum=Complex.Add(i,j);
这样的代码可以很好的运行,但Complex类型并不能像语言中的预定义类型那样发挥作用.
在我看来所谓的运算符重载就是让struct,class,Interface等能够进行运算.
实现C#操作符重载
先写关键字public和static,后跟返回类型,后跟operator关键字,后跟要声明的操作符符号,最后在对一对圆括号中添加恰当的参数.
C#操作符重载方法
1.编写操作符重载方法
2.实例化后,进行操作符运算
案例:
struct Hour
{
//定义一个属性,便于取得value值
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
//该构造函数很据int值创建Hour类,C#操作符重载
public Hour(int value)
{
this.value = value;
}
//声明一个二元操作符,将两个Hour类加到一起
public static Hour operator +(Hour lhs, Hour rhs)
{
return new Hour(lhs.value + rhs.value);
}
//将一个int类型的值和一个Hour类相加
public static Hour operator +(Hour lhs, int rhs)
{
return lhs + new Hour(rhs);
}
public static Hour operator +(int lhs, Hour rhs)
{
return new Hour(lhs) + rhs;
}
}
分析:操作符是public的,搜有的操作符必须都是public的.
操作符是static的.所有的操作符都必须是static的,操作符永远不具有多态性.
而且不能使用virtual,abstract,override或者sealed修饰符.
二元操作符(比如+)有两个显示参数;以元操作符有一个显式的参数.我们有了public Hour(int value)构造函数,就可以将一个int与Hour相加,只是首先要将int转换为Hour
int a;
Hour b=new Hour(b);
Hour sum=new Hour(a);
虽然上述代码完全有效,但相较于让一个Hour和一个int直接相加它即不清晰也不准确.
为了使Hour可以+int,必须声明一个二元操作符+,他的第一个参数是Hour,第二个参数是一个int.
编写测试代码:
class Program
{
static void Main(string[] args)
{
Hour h = new Hour(10);
Hour sum = h + 10;
Console.WriteLine(sum.Value);
Console.ReadKey();
}
}
案例2:
struct Hour
{
//定义一个属性,便于取得value值
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
//该构造函数很据int值创建Hour类,C#操作符重载
public Hour(int value)
{
this.value = value;
}
//声明一个二元操作符,将两个Hour类加到一起
public static Hour operator +(Hour lhs, Hour rhs)
{
return new Hour(lhs.value + rhs.value);
}
//将一个int类型的值和一个Hour类相加
public static Hour operator +(Hour lhs, int rhs)
{
return lhs + new Hour(rhs);
}
public static Hour operator +(int lhs, Hour rhs)
{
return new Hour(lhs) + rhs;
}
//定义操作符重载(一元操作符),++操作符有前缀和后缀两种形式,C#能智能的为前缀和后缀使用同一个操作符.
public static Hour operator ++(Hour hValue)
{
hValue.value++;
return hValue;
}
//==是而元操作符,必须带有两个参数
public static bool operator ==(Hour lhs, Hour rhs)
{
return lhs.value == rhs.value;
}
public static bool operator != (Hour lhs, Hour rhs)
{
return lhs.value != rhs.value;
}
}
但是不是所有的操作符都能被重载,下列运算符不能被重载:[]索引运算符不能被重载,但可以定义索引器;(T)x不能重载转换 运算符,但可以定义新的转换运算符;=(赋值运算符)不能被重载.
=, ., ?:, ??, ->, =>, f(x), as,checked, unchecked, default,delegate, is, new, sizeof, typeof这些运算符不能被重载.
说明,比较运算符(如果重载)必须成对重载;也就是说,如果重载==,也必须重载!=.反之亦然,<和>UI及<=和>=同样如此.
若要在 自定义类中重载运算符,需要在该类中创建具有正确签名的方法,该方法必须命名为”operator X”,其中X是正在重载的运算符的名称或符号.一元运算符具有一个参数,二元运算符具有两个参数.在每种情况下,参数的类型必须与声明该运算符的类或结构的类型相同,如下:
public static Complex operator + (Complex c1,Complex c2)
C#编程(四十)----------运算符重载的更多相关文章
- YTU 2640: 编程题:运算符重载---矩阵求和
2640: 编程题:运算符重载---矩阵求和 时间限制: 1 Sec 内存限制: 128 MB 提交: 484 解决: 190 题目描述 /* 有两个矩阵a和b,均为2行3列.求两个矩阵之和. 重 ...
- C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)
运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...
- [b0018] python 归纳 (四)_运算符重载
# -*- coding: UTF-8 -*- """ 测试运算符重载 加法 总结: python 运算符表达式其实都是调用 类中方法 __xxx__ + <--- ...
- C#高级编程四十九天----队列
队列 1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从还有一端移除. 2.长处 (1).能对集合进行顺序处理 ...
- python学习笔记四 (运算符重载和命名空间、类)
从以上代码中应该了解到: obj.attribute 查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以 ...
- C++基础 学习笔记五:重载之运算符重载
C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...
- sdut 面向对象程序设计上机练习十(运算符重载)
面向对象程序设计上机练习十(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 定义一个复数类Complex,重载运算符"+" ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课
centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobacku ...
随机推荐
- keyspace notification(键空间通知)-待验证
一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 如何使用 Redis 来实现定时任务? 二.序言: 本文所说的定时任务 ...
- 纯js遍历json获取值动态为select添加option
遍历json数组 并动态为select添加option 直接上代码,重要部分有注解 <!DOCTYPE html> <html lang="en"> < ...
- linux(CentOS) 下mysql自动备份
1.创建并编辑文件 /usr/sbin/bakmysql.sh,命令: vi /usr/sbin/bakmysql.sh 内容如下: db_user="root" db_passw ...
- Java编程的逻辑 (2) - 赋值
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 使用div模拟出frameset效果
<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" > <head> < ...
- GitLab备份的创建与恢复
使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份: gitlab-rake gitlab:backup:create使 ...
- Dynamic Rankings || 动态/静态区间第k小(主席树)
JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...
- jenkins 整合maven,svn(配置钩子程序实现提交代码自动构建),tomcat实现热部署(windows+linux分别实现)
springboot : https://blog.csdn.net/zjh_746140129/article/details/80904876 1 准备工作: (1)运行jenkins的tomca ...
- leetcode 两个排序的中位数 python
两个排序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 n ...
- Intel P6以来核心架构及对应型号、芯片组一览表
转载或拿走使用请注明出处,谢谢! 注1:5系列以前的芯片组部分可以支持多代处理器(如部分945可以支持65nm.45nm的处理器),5系列开始此现象较少见. 注2:插座兼容性①Socket370接口处 ...