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#编程(四十)----------运算符重载相关推荐
- c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符
new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...
- 【C++学习笔记四】运算符重载
当调用一个重载函数和重载运算符时,编译器通过把您所使用的参数类型和定义中的参数类型相比较,巨鼎选用最合适的定义.(重载决策) 重载运算符时带有特殊名称的函数,函数名是由关键字operator和其后要重 ...
- python 归纳 (四)_运算符重载
# -*- coding: UTF-8 -*- """ 测试运算符重载 加法总结:python 运算符表达式其实都是调用 类中方法 __xxx__+ <---> ...
- [YTU]_2640( 编程题:运算符重载---矩阵求和)
题目描述 /* 有两个矩阵a和b,均为2行3列.求两个矩阵之和. 重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和 ...
- [YTU]_2640(编程题:运算符重载---矩阵求和)
题目描述 /* 有两个矩阵a和b,均为2行3列.求两个矩阵之和. 重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和 ...
- 四十年编程感想 -- 记录
节选自https://www.ruanyifeng.com/blog/2022/09/weekly-issue-222.html 上周,国外程序员论坛 Hacker News 有一篇热门文章<四 ...
- (C++学习笔记七)运算符重载
九.运算符重载 1.Code : #include<iostream> using namespace std;//运算符重载的意义: //对已有的 运算符 重新进行定义,赋予其另一项功能 ...
- 中双目运算符_C++日志(四十)教你如何以非成员函数的形式重载运算符
上一篇日志中讲述了如何通过类的非静态函数成员,进行运算符重载: 机器学习入坑者:C++日志(三十九)教你如何以类的非静态成员函数形式重载运算符zhuanlan.zhihu.com 在C++中,同样可 ...
- Python编程基础:第四十九节 鸭子类型Duck Typing
第四十九节 鸭子类型Duck Typing 前言 实践 前言 本节我们一起学习一个非常有趣的知识点:鸭子类型.有这么一句话:If it walks like a duck, and it quacks ...
最新文章
- 论机器学习领域的内卷
- R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表
- MongoDB 索引
- java 继承先后顺序_Java中的继承关系的加载顺序
- [转载]树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像...
- DVSDK/EZSDK软件框架简介
- go程序打包:针对不同OS打包成不同的可执行文件
- 【汇编语言】王爽实验5(5)(6)的解答 建立数据类型匹配的观念
- 超越Excel、python的数据可视化报表,月薪3W的人都在用
- AOP和OOP的区别
- 芒格:倒过来思考有利于理解事物本质并解决问题
- sqlmap注入实战教程(图文详解)
- c4dr20怎么安装oc渲染器怎么安装_C4D R20 Octane渲染器
- echarts 生成 迁徙图_Echarts4+EchartsGL 3D迁徙图(附源码)
- 谷歌地图kml能透明吗_如何打开KML和KMZ文件并与卫星影像叠加
- ThinkPad产品进入BIOS的方法
- android ota功能,支持 OTA 更新 | Android 开源项目 | Android Open Source Project
- apidoc 自动化生成 api接口文档
- 两子公司犯单位行贿罪各罚100万 鹏博士收警示函高度重视
- 金融结算系统的基础业务之账户体系结构分析
热门文章
- 序号-element-序号根据页数和行数计算
- python写sql语句_python3将变量写入SQL语句的实现方式
- composer全局 linux_Linux下全局安装composer方法
- centos安装python环境_Centos7 安装python3 环境 并使用pip安装docker-compose
- pyqt5多进程 python_PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
- python异常处理_Python爬虫入门(5):URLError异常处理
- 计算机格式化系统,硬盘被苹果电脑格式化后如何恢复数据?
- js结束当前循环关键词_干货||什么是事件循环机制
- idea java 桌面应用_IDEA打包应用程序的教程图解
- 苹果如何分屏_玩转mac—苹果电脑操作教程