运算符重载

所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力.

例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,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#编程(四十)----------运算符重载的更多相关文章

  1. YTU 2640: 编程题:运算符重载---矩阵求和

    2640: 编程题:运算符重载---矩阵求和 时间限制: 1 Sec  内存限制: 128 MB 提交: 484  解决: 190 题目描述 /* 有两个矩阵a和b,均为2行3列.求两个矩阵之和. 重 ...

  2. C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)

    运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...

  3. [b0018] python 归纳 (四)_运算符重载

    # -*- coding: UTF-8 -*- """ 测试运算符重载 加法 总结: python 运算符表达式其实都是调用 类中方法 __xxx__ + <--- ...

  4. C#高级编程四十九天----队列

    队列 1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从还有一端移除. 2.长处 (1).能对集合进行顺序处理 ...

  5. python学习笔记四 (运算符重载和命名空间、类)

    从以上代码中应该了解到: obj.attribute  查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以 ...

  6. C++基础 学习笔记五:重载之运算符重载

    C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...

  7. sdut 面向对象程序设计上机练习十(运算符重载)

    面向对象程序设计上机练习十(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 定义一个复数类Complex,重载运算符"+" ...

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

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

  9. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

随机推荐

  1. Uploadify3.2中文提示

    版本:Uploadify Version 3.2官网:http://www.uploadify.com Uploadify是一款基于Jquery的上传插件,用起来很方便.但上传过程中的提示语言为英文, ...

  2. poj2148

    题意:给出若干个没有公共面积的多边形,几个多边形可能属于同一个国家,要求给这个地图染色,同一个国家用相同的颜色,相邻国家不能用相同颜色.问最少需要多少种颜色. 分析:计算几何+搜索.先判断哪些多边形是 ...

  3. 使用配置文件启动MongoDB

    Ubuntu 16.04 (阿里云ECS),MongoDB 4.0, 原来,已经写了10篇MongoDB的随笔了.可是,自己居然没有使用配置文件启动过MongoDB,对其更多的配置是不明白的. 昨天( ...

  4. 微信小程序入门与实战

    1. 备注:并不是真的不需要下载,只是下载的包小于1MB,给人的感觉像是不用下载 2. 3. 理论上:同一级可以有无限个,纵向只能有五级 目前小程序分包大小有以下限制: 整个小程序所有分包大小不超过 ...

  5. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

  6. JS框架图

    一.JS框架

  7. Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)

    一.Servlet简介  1.什么是servlet: sun公司提供的一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API动态的向 ...

  8. awk 调用 shell 命令,并传递参数

    from:awk 调用 shell 命令的两种方法:system 与 print shell 向awk传递命令,这样使用即可: awk -v  ...  但反过来呢?awk调用外部命令,同时也传参呢? ...

  9. word2vec中的数学原理一 目录和前言

    最近在看词向量了,因为这个概念对于语言模型,nlp都比较重要,要好好的学习一下.把网上的一些资料整合一下,搞个系列. 主要参考:    word2vec 中的数学原理详解                ...

  10. 转:Spring中事物管理

    1.什么是事务? 事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物具有四大特性ACID 说到事务,就不得不说其4大特性,主要如下 原子性:(atomicity) 原子性指的是事务是 ...