C#操作符重载

11.5.1 问题的提出

在面向对象的程序设计中,自己定义一个类,就等于创建了一个新类型。类的实例和变量一样,可以作为参数传递,也可以作为返回类型。

在第七章中,我们介绍了系统定义的许多操作符。比如对于两个整型变量,使用算术操作符可以简便地进行算术运算:

class A
{
 public int x;
 public int y;
 public int Plus{
    return x+y;
  }
}
再比如,我们希望将属于不同类的两个实例的数据内容相加:

class B
{
  public int x;
}
class Test
{
 public int z;
 public static void Main{
    A a=new A();
    B b=new B();
    z=a.x+b.x;
 }
}

使用a.x+b.x这种写法不够简洁,也不够直观。更为严重的问题是,如果类的成员中声明时使用的不是publixc修饰符的话,这种访问就是非法的。

我们知道,在C#中,所有数据要么属于某个类,要么属于某个类的实例,充分体现了面向对象的思想。因此,为了表达上的方便,人们希望可以重新给已定义的操作符赋予新的含义,在特定的类的实例上进行新的解释。这就需要通过操作符重载来解决。

11.5.2 使用成员方法重载操作符

C#中,操作符重载总是在类中进行声明,并且通过调用类的成员方法来实现。

操作符重载声明的格式为:

type operator operator-name(formal-param-list)

C#中,下列操作符都是可以重载的:

+ - ! ~ ++ -- true false

* / % & | ^ << >> == != > < >= <=

但也有一些操作符是不允许进行重载的,如:

=,&&,||,?:,new,typeof,sizeof,is

一元操作符重载

顾名思义,一元操作符重载时操作符只作用于一个对象,此时参数表为空,当前对象作为操作符的单操作数。

下面我们举一个角色游戏中经常遇到的例子。扮演的角色具有内力、体力、经验值、剩余体力、剩余内力五个属性,每当经验值达到一定程序时,角色便会升级,体力、内力上升,剩余体力和内力补满。“升级”我们使用重载操作符“++”来实现。

程序清单11-10:

using System;
class Player
{
 public int neili;
 public int tili;
 public int jingyan;
 public int neili_r;
 public int tili_r;
 public Player()
 {
   neili=10;
   tili=50;
   jingyan=0;
   neli_r=50;
   tili_r=50;
 }
 public static Player operator ++(Player p){
   p.neili=p.neili+50;
   p.tili=p.tili+100;
   p.neili_r=p.neili;
   p.tili_r=p.tili;
   return p;
 }
 public void Show()
 {
  Console.WriteLine("Tili:{0}",tili);
  Console.WriteLine("Neili:{0}",neili);
  Console.WriteLine("Tili_full:{0}",tili_r);
  Console.WriteLine("Neili_full:{0}",neili_r);
 }
}
class Test
{
 public static void Main(){
    Player man=new Player();
    man.Show();
    man++;
    Console.WriteLine("Now upgrading...:");
    man.Show();
 }
}

二元操作符重载

大多数情况下我们使用二元操作符重载。这时参数表中有一个参数,当前对象作为该操作符的左操作数,参数作为操作符的右操作数。

下面我们给出二元操作符重载的一个简单例子,即笛卡儿坐标相加。

程序清单11-11:

using System;
class DKR
{
  public int x,y,z;
  public DKR(int vx,int vy,int vz){
     x=vx;
     y=vy;
     z=vz;
  }
  public static DKR operator +(DKR d1,DKR d2)
  {
  DKR dkr=new DKR(0,0,0);
  dkr.x=d1.x+d2.x;
  dkr.y=d1.y+d2.y;
  dkr.z=d1.z+d2.z;
  return dkr;
  }
}
class Test
{
  publixc statixc void Main(){
    DKR d1=new DKR(3,2,1);
    DKR d2=new DKR(0,6,5);
    DKR d3=d1+d2;
    Console.WriteLine("The 3d location of d3 is:{0},{1},{2}",d3.x,d3.y,d3,z);
  }
}

试着编译、运行该程序,看结果是否与预期一致。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#重载
, c#
, 实例
, 面向对象
, public
, 操作符
, 重载实例
算术
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-08-03 10:53:16

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

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

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

C#中奇妙的操作符重载

C#中奇妙的操作符重载 细心的朋友可能发现,C#虽然可以重载操作符,但和C++比较起来,却有很大的不同.定义的时候重载操作符方法必须是static,而且至少有一个参数(一目和二目分别是一个和两个),C#和C++比起来,最重要的特征是:<.>:==.!=:true.false必须成对出现,即重载了"<"就必须重载">",重载了"=="就必须重载"!=",重载了"true"就必须重载&q

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/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化     全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this-&g

c++ 操作符重载-关于操作符重载的问题

问题描述 关于操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个引用的话,编译器会报错.因为返回的类是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2) { Lis

c++-关于C++操作符重载的问题

问题描述 关于C++操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个对象的引用的话,编译器会报错.因为返回的对象是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2

运算符重载-C++ 操作符重载的内存释放问题

问题描述 C++ 操作符重载的内存释放问题 =操作符重载,给复构造函数进行赋值时的代码如下: MyString & MyString::operator =(const MyString &str) { if(this == &str) return *this; delete []m_pData; //**???????????????????????????? ** m_pData = NULL; m_pData = new char(strlen(str.m_pData) +

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++操作符重载的问题 我在这个程序中重载>>操作符,报出了如下错误: Error 1 error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion) Error 2 3 IntelliSense: no operator ">&g