C#中奇妙的操作符重载

C#中奇妙的操作符重载

细心的朋友可能发现,C#虽然可以重载操作符,但和C++比较起来,却有很大的不同。定义的时候重载操作符方法必须是static,而且至少有一个参数(一目和二目分别是一个和两个),C#和C++比起来,最重要的特征是:<、>;==、!=;true、false必须成对出现,即重载了“<”就必须重载“>”,重载了“==”就必须重载“!=”,重载了“true”就必须重载“false”;另外,还必须实现基类object的两个虚方法:GetHashCode()和Equals(object obj)。

以下是程序代码,有些地方写得不完善,只能说仅仅说明了问题,不对之处请指教:

using System;

using System.Xml;

namespace ConsoleApplication8

{

/// <summary>

/// 姓名类

/// </summary>

class Namer

{

private string FirstName;

private string LastName;

public Namer()

{

this.Init(null,null);

}

public Namer(string fn,string ln)

{

this.Init(fn,ln);

}

private void Init(string fn,string ln)

{

this.FirstName=fn;

this.LastName=ln;

}

/// <summary>

/// 重载运算符true

/// </summary>

/// <param name="n"></param>

/// <returns>如果姓名中姓或名有一个为空,就返回假</returns>

public static bool operator true(Namer n)

{

if(n.FirstName==null || n.LastName==null)

return false;

else

return true;

}

/// <summary>

/// 重载运算符false

/// </summary>

/// <param name="n"></param>

/// <returns></returns>

public static bool operator false(Namer n)

{

if(n.FirstName==null || n.LastName==null)

return false;

else

return true;

}

/// <summary>

/// 重载运算符==

/// </summary>

/// <param name="n1"></param>

/// <param name="n2"></param>

/// <returns></returns>

public static bool operator ==(Namer n1,Namer n2)

{

if(n1.FirstName==n2.FirstName && n1.LastName==n2.LastName)

return true;

else

return false;

}

/// <summary>

/// 重载运算符!=

/// </summary>

/// <param name="n1"></param>

/// <param name="n2"></param>

/// <returns></returns>

public static bool operator !=(Namer n1,Namer n2)

{

if(n1.FirstName!=n2.FirstName || n1.LastName !=n2.LastName)

return true;

else

return false;

}

/// <summary>

/// 重载运算符>

/// </summary>

/// <param name="n1"></param>

/// <param name="n2"></param>

/// <returns></returns>

public static bool operator >(Namer n1,Namer n2)

{

return (n1.FirstName.CompareTo(n2.FirstName)>0 && n1.LastName.CompareTo(n2.LastName)>0);

}

/// <summary>

/// 重载运算符<

/// </summary>

/// <param name="n1"></param>

/// <param name="n2"></param>

/// <returns></returns>

public static bool operator <(Namer n1,Namer n2)

{

return (n1.FirstName.CompareTo(n2.FirstName)<0 && n1.LastName.CompareTo(n2.LastName)<0);

}

/// <summary>

/// 重写方法,必须有,后面的111是乱加的,你也可以写其它的

/// </summary>

/// <returns></returns>

public override int GetHashCode()

{

return base.GetHashCode()*111;

}

/// <summary>

/// 重写方法,必须有

/// </summary>

/// <param name="obj"></param>

/// <returns></returns>

public override bool Equals(object obj)

{

return base.Equals (obj);

}

/// <summary>

/// 重写方法,必须有

/// </summary>

/// <returns></returns>

public override string ToString()

{

return "姓:"+this.FirstName+" 名:"+this.LastName;

}

public static void Main()

{

Namer n1=new Namer("li","zanhong");

Namer n2=new Namer("ahang","aan");

//Namer n2=new Namer("li","zanhong");

if(n1==n2)

Console.WriteLine("一样的名字");

else

Console.WriteLine("不一样的名字");

/////////////////////////////////////

if(n1!=n2)

Console.WriteLine("不一样的名字成立");

else

Console.WriteLine("同样的名字成立");

/////////////////////////////////////

if(n1>n2)

Console.WriteLine(n1.ToString()+">"+n2.ToString());

else if(n1<n2)

Console.WriteLine(n1.ToString()+"<"+n2.ToString());

else

Console.WriteLine("没有正确比较");

Console.ReadLine();

}

}

}

时间: 2024-12-01 19:36:39

C#中奇妙的操作符重载的相关文章

C#中如何利用操作符重载和转换操作符

原文:C#中如何利用操作符重载和转换操作符 操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整数加到一起的代码. 当编译器发现两个string类型的实例使用+操作符的时候,编译器会生成把两个字符串连接到一起的代码.那么编译器怎么就会知道这样做呢?如何进行操作符重载呢? 下面C#代码展示了一个类中如何进行操作符重载: namespace Do

Ruby中对一元操作符重载实例_ruby专题

一元操作大家都知道,就是表达式的操作符只有一个输入值.这个在C和Java中都很常见.今天我们要探讨一下Ruby中的一元操作符重载. 一元操作符有:+ – * ! & 等,为了避免与数值的 + – 混淆,重载一元操作符,要在后面加上一个 @ 操作符. 1. 一个简单的一元操作符重载例子:-@ 操作符我们以String类为例子.String默认没有定义 – 操作符: 复制代码 代码如下: 1.9.3p125 :027 > a = "Hello" => "Hel

《面向对象的思考过程(原书第4版)》一3.4 操作符重载

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.4节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 3.4 操作符重载 有些面向对象的语言允许你重载操作符.C++是其中的一个例子.操作符重载允许你修改一个操作符的含义.例如,当大多数人看到一个加号时,会假设它代表加法运算.如果你看到以下恒等式 x = 5 + 6 ; 你会认为x的值是11.在这种情况下你是对的.然而,有时加号

C++中操作符重载的const与默认构造函数

问题描述 C++中操作符重载的const与默认构造函数 原代码 class TestOverloadLessThan { public: TestOverloadLessThan( int m ) : m_int(m){}; int getInt(){ return m_int;}; bool operator<( const TestOverloadLessThan& t) const { return ( this->getInt() < t.getInt() ); }; p

C++中复制构造函数和重载赋值操作符总结_C 语言

前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符的实现要点: 4.复制构造函数的一些细节. 复制构造函数和重载赋值操作符的定义 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: 复制代码 代码如下: class CTes

C++中的操作符重载详细解析_C 语言

一.什么是操作符重载操作符重载可以分为两部分:"操作符"和"重载".说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: 复制代码 代码如下: #include <iostream> using namespace std; int main(){    int a = 2 , b = 3;    float c =

C#锐利体验之第八讲 索引器与操作符重载

索引 索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用.索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.下面是典型的索引器的设计,我们在这里忽略了具体的实现. class MyClass{    public object this [int index]    {        get        {            // 取数据        }        set  

C++的操作符重载概述

1.什么是操作符重载 可以使用分词将操作符重载理解为:操作符+重载. C++中的操作符很多,如+,-,*,\等等. C++中的重载也是C++中面向对象多态的体现. 简单说操作符重载: C++中有:int a=2+3; 那么a=5 操作符重载可以实现对自定义类型的操作: #include <iostream> using namespace std; class Point{ public: int x; int y; Point(int _x,int _y):x(_x),y(_y){ } Po

C#操作符重载

11.5.1 问题的提出 在面向对象的程序设计中,自己定义一个类,就等于创建了一个新类型.类的实例和变量一样,可以作为参数传递,也可以作为返回类型. 在第七章中,我们介绍了系统定义的许多操作符.比如对于两个整型变量,使用算术操作符可以简便地进行算术运算: class A { public int x; public int y; public int Plus{ return x+y; } } 再比如,我们希望将属于不同类的两个实例的数据内容相加: class B { public int x;