[No0000F9]C# 运算符重载
您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。
- public static Box operator+ (Box b, Box c)
- {
- Box box = new Box();
- box.length = b.length + c.length;
- box.breadth = b.breadth + c.breadth;
- box.height = b.height + c.height;
- return box;
- }
上面的函数为用户自定义的类 Box 实现了加法运算符(+)。它把两个 Box 对象的属性相加,并返回相加后的 Box 对象。
可重载和不可重载运算符
运算符 |
描述 |
+, -, !, ~, ++, -- |
这些一元运算符只有一个操作数,且可以被重载。 |
+, -, *, /, % |
这些二元运算符带有两个操作数,且可以被重载。 |
==, !=, <, >, <=, >= |
这些比较运算符可以被重载。 |
&&, || |
这些条件逻辑运算符不能被直接重载。 |
+=, -=, *=, /=, %= |
这些赋值运算符不能被重载。 |
=, ., ?:, ->, new, is, sizeof, typeof |
这些运算符不能被重载。 |
- using System;
- namespace OperatorOvlApplication
- {
- class Box
- {
- private double length; // 长度
- private double breadth; // 宽度
- private double height; // 高度
- public double getVolume()
- {
- return length * breadth * height;
- }
- public void setLength( double len )
- {
- length = len;
- }
- public void setBreadth( double bre )
- {
- breadth = bre;
- }
- public void setHeight( double hei )
- {
- height = hei;
- }
- // 重载 + 运算符来把两个 Box 对象相加
- public static Box operator+ (Box b, Box c)
- {
- Box box = new Box();
- box.length = b.length + c.length;
- box.breadth = b.breadth + c.breadth;
- box.height = b.height + c.height;
- return box;
- }
- public static bool operator == (Box lhs, Box rhs)
- {
- bool status = false;
- if (lhs.length == rhs.length && lhs.height == rhs.height
- && lhs.breadth == rhs.breadth)
- {
- status = true;
- }
- return status;
- }
- public static bool operator !=(Box lhs, Box rhs)
- {
- bool status = false;
- if (lhs.length != rhs.length || lhs.height != rhs.height
- || lhs.breadth != rhs.breadth)
- {
- status = true;
- }
- return status;
- }
- public static bool operator <(Box lhs, Box rhs)
- {
- bool status = false;
- if (lhs.length < rhs.length && lhs.height
- < rhs.height && lhs.breadth < rhs.breadth)
- {
- status = true;
- }
- return status;
- }
- public static bool operator >(Box lhs, Box rhs)
- {
- bool status = false;
- if (lhs.length > rhs.length && lhs.height
- > rhs.height && lhs.breadth > rhs.breadth)
- {
- status = true;
- }
- return status;
- }
- public static bool operator <=(Box lhs, Box rhs)
- {
- bool status = false;
- if (lhs.length <= rhs.length && lhs.height
- <= rhs.height && lhs.breadth <= rhs.breadth)
- {
- status = true;
- }
- return status;
- }
- public static bool operator >=(Box lhs, Box rhs)
- {
- bool status = false;
- if (lhs.length >= rhs.length && lhs.height
- >= rhs.height && lhs.breadth >= rhs.breadth)
- {
- status = true;
- }
- return status;
- }
- public override string ToString()
- {
- return String.Format("({0}, {1}, {2})", length, breadth, height);
- }
- }
- class Tester
- {
- static void Main(string[] args)
- {
- Box Box1 = new Box(); // 声明 Box1,类型为 Box
- Box Box2 = new Box(); // 声明 Box2,类型为 Box
- Box Box3 = new Box(); // 声明 Box3,类型为 Box
- Box Box4 = new Box();
- double volume = 0.0; // 体积
- // Box1 详述
- Box1.setLength(6.0);
- Box1.setBreadth(7.0);
- Box1.setHeight(5.0);
- // Box2 详述
- Box2.setLength(12.0);
- Box2.setBreadth(13.0);
- Box2.setHeight(10.0);
- // 使用重载的 ToString() 显示两个盒子
- Console.WriteLine("Box1: {0}", Box1.ToString());
- Console.WriteLine("Box2: {0}", Box2.ToString());
- // Box1 的体积
- volume = Box1.getVolume();
- Console.WriteLine("Box1 的体积: {0}", volume);
- // Box2 的体积
- volume = Box2.getVolume();
- Console.WriteLine("Box2 的体积: {0}", volume);
- // 把两个对象相加
- Box3 = Box1 + Box2;
- Console.WriteLine("Box3: {0}", Box3.ToString());
- // Box3 的体积
- volume = Box3.getVolume();
- Console.WriteLine("Box3 的体积: {0}", volume);
- //comparing the boxes
- if (Box1 > Box2)
- Console.WriteLine("Box1 大于 Box2");
- else
- Console.WriteLine("Box1 不大于 Box2");
- if (Box1 < Box2)
- Console.WriteLine("Box1 小于 Box2");
- else
- Console.WriteLine("Box1 不小于 Box2");
- if (Box1 >= Box2)
- Console.WriteLine("Box1 大于等于 Box2");
- else
- Console.WriteLine("Box1 不大于等于 Box2");
- if (Box1 <= Box2)
- Console.WriteLine("Box1 小于等于 Box2");
- else
- Console.WriteLine("Box1 不小于等于 Box2");
- if (Box1 != Box2)
- Console.WriteLine("Box1 不等于 Box2");
- else
- Console.WriteLine("Box1 等于 Box2");
- Box4 = Box3;
- if (Box3 == Box4)
- Console.WriteLine("Box3 等于 Box4");
- else
- Console.WriteLine("Box3 不等于 Box4");
- Console.ReadKey();
- }
- }
- }
- Box1: (, , )
- Box2: (, , )
- Box1 的体积:
- Box2 的体积:
- Box3: (, , )
- Box3 的体积:
- Box1 不大于 Box2
- Box1 小于 Box2
- Box1 不大于等于 Box2
- Box1 小于等于 Box2
- Box1 不等于 Box2
- Box3 等于 Box4
注意:一般重载过“==”和“!=”运算符的类,也要重写Object.GetHashCode()和Object.Equals(object o),上例中未实现。
[No0000F9]C# 运算符重载的更多相关文章
- C++ 运算符重载时,将运算符两边对象交换问题.
在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- 标准C++之运算符重载和虚表指针
1 -> *运算符重载 //autoptr.cpp #include<iostream> #include<string> using namespace std ...
- python运算符重载
python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...
- PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天
PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数 1 构造 2 析构 3 赋值 4 拷贝构造 5 oper ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- 我的c++学习(8)运算符重载和友元
运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...
- c/c++面试题(6)运算符重载详解
1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...
随机推荐
- unix缓冲
目的:尽量减少read,write调用的次数. 标准IO提供3种IO: 1.全缓冲.在填满IO缓冲区后才进行实际的IO操作. 2.行缓冲.当输入和输出遇到换行符时,执行IO操作.(设计终端) 3.不带 ...
- Eureka微服务ID
Instance ID用于唯一标识注册到Eureka Server上的微服务实例.我们可在Eureka Server的首页直观地看到各个微服务的Instance ID.例如,图11-1中的itmuch ...
- PHP —— 识别运算符实现逻辑比较
最近遇到一个功能的开发,大致意思就是根据用户输入的条件,进行相关的比较操作.本来打算使用用户选择运算符的方式,但是后来结合项目实际,发现需要使用用户输入的自定义运算比较现实一点.大致意思就是: 1.用 ...
- CentOS 7 配置HTTPS加密访问SVN
上一篇文章已经介绍了如何在CentOS7环境下安装SVN并整合HTTP访问 http://www.cnblogs.com/fjping0606/p/7581093.html 那么本文则介绍如何添加HT ...
- SpringBoot普通类中如何获取其他bean例如Service、Dao(转)
工具类 import org.springframework.beans.BeansException; import org.springframework.context.ApplicationC ...
- spring data jpa 查询自定义字段,转换为自定义实体
目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台. 环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 ...
- Retrofit/Okhttp API接口加固技术实践(上)
作者:Tamic 地址:http://blog.csdn.net/sk719887916/article/details/61914609 写这篇文章,我纠结了非常久,究竟是属于app安全系列,还是属 ...
- json 字符串包含数组转换为object对象是报异常java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
前台传到后台的json字符串 前台实现这种格式json字符串方式: function contentFun(){ respType = respTypeFun(); return "{\&q ...
- mysql delete两种关联删除方式
基本格式: DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或 DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id 示例应用: ...
- 浅谈JavaScript对象数组根据某属性sort升降序排序
1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16, s ...