运算符重载看起来与标准静态方法声明类似,但它们使用关键字operator和运算符本身,而不是一个方法名:

public static 返回类型 operator +(类型1 变量1,类型2 变量2)

{

//返回类型,类型1,类型2 ,可以相同,也可以全部不同

}

如果使用混合类型的话,需要注意的是,不可以将相同的运算符添加到不同的类进行重载。

还需要注意,操作数的顺序也必须与运算符重载的参数顺序保持一致。

 class AddClass1
{
public int val;
public static AddClass1 operator +(AddClass1 op1,AddClass1 op2)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = op1.val + op2.val;
return returnVal;
} public static AddClass1 operator ~(AddClass1 op1)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = ~op1.val;//按位取反
return returnVal;
} public static AddClass3 operator +(AddClass1 op1, AddClass2 op2)
{
AddClass3 returnVal = new AddClass3();
returnVal.val = op1.val + op2.val;
return returnVal;
}
} class AddClass2
{
public int val;
} class AddClass3
{
public int val;
} class Program
{
static void Main(string[] args)
{
AddClass1 op1 = new AddClass1();
op1.val = ;
AddClass2 op2 = new AddClass2();
op2.val = ;
AddClass3 op3 = op1 + op2;
Console.WriteLine("op1+op2 = {0}", op3.val);
Console.ReadKey();
}
}

如果重载了true和false运算符,就可以在布尔表达式中直接使用类。例如

ClassA a; if(a){}

以下运算符不能重载,例如+=,=,&&,||

此外>,<必须成对重载 [>=,<=]

此规则也==,!=,但是对于这些==,!=运算符,常常需要重写Object.Equals()和Object.GetHashCode(),因为这两个函数也可以用于比较对象。

重写这些方法。可以确保无论类的用户使用什么技术,都能得到相同的结果。这不太重要,但应增加进来,以保证其完整性。

它需要下述非静态重写方法

class AddClass1
{
public int val; /// <summary>
/// ==和!=的重载必须成对出现
/// </summary>
/// <param name="op1"></param>
/// <param name="op2"></param>
/// <returns></returns>
public static bool operator ==(AddClass1 op1, AddClass1 op2)
{
return (op1.val == op2.val);
} /// <summary>
/// ==和!=的重载必须成对出现
/// </summary>
/// <param name="op1"></param>
/// <param name="op2"></param>
/// <returns></returns>
public static bool operator !=(AddClass1 op1, AddClass1 op2)
{
return !(op1 == op2);
} public override bool Equals(object obj)
{
if (obj is AddClass1)
{
return val == ((AddClass1)obj).val;
}
else
{
throw new ArgumentException(string.Format("Can not compare AddClass1 objects with objects of type {0}", obj.GetType().ToString()));
}
} public override int GetHashCode()
{
return val;
}
}

GetHashCode()可根据其状态,获取对象实例的一个唯一的int值[类似于主键,唯一标示符]

需要注意的是Equals必须使用object参数,否则就变成重载函数而不是重写了。

C#的运算符重载的更多相关文章

  1. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

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

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

  3. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  4. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  5. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  6. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  7. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  8. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

  9. c/c++面试题(6)运算符重载详解

    1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...

  10. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

随机推荐

  1. BZOJ 3511 土地划分

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3511 题目分析: 看上去和前面的人员雇佣以及小M种田都很像. 最小割模型来求最大值,一般都 ...

  2. Python大数据依赖包安装

    一.安装 先安装python2.7.6,win下的numpy这些包需要直接匹配版本,然后安装“numpy-1.8.1-win32-superpack-python2.7”和“scipy-0.16.0- ...

  3. Linux命令 + Shell

    1. 之前利用Ubuntu14.10的镜像安装了个虚拟机,本以为自己在windows上的就是管理员的权限,就理所当然的认为虚拟的Linux系统也是root权限.而且虽然@符号前的的标识不是root,但 ...

  4. iOS开发之runtime的运用-获取当前网络状态

    之前写过runtime的一些东西,这次通过runtime获取一些苹果官方不想让你拿到的东西,比如,状态栏内部的控件属性.本文将通过runtime带你一步步拿到状态栏中显示网络状态的控件,然后通过监测该 ...

  5. C#单链表(数据结构)

    学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar 链表是用一组任意的存储单元来存储线性表 ...

  6. struts2漏洞原理及解决办法

    1.原理 Struts2的核心是使用的webwork框架,处理action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介 ...

  7. sql server 2008 执行计划

    SSMS允许我们查看一个图形化的执行计划(快捷键Ctrl+L)

  8. 山寨小小军团开发笔记 之 GamePool

    很多时候我们对于物体(比如弓箭)大量的生成与销毁,这个时候可以把弓箭放在内存池中进行管理,加快体验.自己Copy了一个简易版的. 一.代码 GameObjectPoolManager.cs using ...

  9. Css 单图片按钮实例(css 图片变换)

    1.场景描述,根据鼠标的移动,动态的切换按钮图片. 2.方法1,准备两张120*41的图片,一张正常状态图片,一张按下效果图片.在鼠标放在的按钮上设置按下图片,移开又恢复到正常状态图片.缺点:在网页上 ...

  10. UPC 2224 Boring Counting (离线线段树,统计区间[l,r]之间大小在[A,B]中的数的个数)

    题目链接:http://acm.upc.edu.cn/problem.php?id=2224 题意:给出n个数pi,和m个查询,每个查询给出l,r,a,b,让你求在区间l~r之间的pi的个数(A< ...