C#操作符的重载

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

type operator operator-name(formal-param-list)  C#操作符重载可以实现的有:

+ - ! ~ ++ -- true false

* / % & | ^ << >> == != > < >= <= 
但也有一些操作符是不允许进行重载的,如:

=,&&,||,?:,new,typeof,sizeof,is  C#操作符重载之一元操作符重载
顾名思义,一元操作符重载时操作符只作用于一个对象,此时参数表为空,当前对象作为操作符的单操作数。
下面我们举一个角色游戏中经常遇到的例子。扮演的角色具有内力、体力、经验值、剩余体力、剩余内力五个属性,每当经验值达到一定程序时,角色便会升级,体力、内力上升,剩余体力和内力补满。“升级”我们使用重载操作符“++”来实现。
C#操作符重载程序:  C#操作符重载之二元操作符重载

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();

}

}

大多数情况下我们使用二元操作符重载。这时参数表中有一个参数,当前对象作为该操作符的左操作数,参数作为操作符的右操作数。
下面我们给出二元操作符重载的一个简单例子,即笛卡儿坐标相加。 C#操作符重载程序:

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;

}

}  //C#操作符重载

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);

}

}

时间: 2024-10-07 13:34:46

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

关于解引用*和箭头操作符-&gt;的重载

这里以一个智能指针类为例,智能指针所指为一个对象. 而事实上,STL迭代器的开发均需要重载这两个操作符,上一篇文章分析STL 迭代器中除了要用到template技巧外,还需要重载技巧 1 #include<iostream> 2 using namespace std; 3 class Screen 4 { 5 6 public: 7 friend ostream& operator<<(ostream&os, Screen &s); 8 int actio

操作符的重载

1.基本 输入和输出 cout << "hello" << endl << "world"; 输出: hello world 可见,输出,endl 是换行的作用 int x; cout << "input the num what you want:"; cin >> x; cout << "the num you input is:"; cout <

c++ new和delete操作符的重载

先分析一条语句: Base *pb= new Base; 这条语句是怎么执行的?首先,这个函数调用标准C++的operator new()函数,然后调用Base的构造函数. 如果我们自定义new时,可以自定义一个new,如 class Base { static void* operator new(size_t size) { } static void operator delete(void *p) { } } 这个Base类里面的new 和delete覆盖掉标准new和标准delete,

【转】c++ new操作符的重载

基本概念: 1. 操作符重载:C++支持对某个操作符赋予不同的语义 2. new操作符:申请内存,调用构造函数 关于c++ new操作符的重载 你知道c++ 的new 操作符和operator new 的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时, string *pa = new string("memory managerment"); 你使用的是new 操作符,这个操作符和sizeof 一样,是c++ 语言级别支持的.你不能改变它的语义,它做的事情总是不变的:分

数组操作符的重载(二十八)

我们在学习了 string 类对象后,就不禁头脑中冒出了一个问题:string 类对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗?那么 string 类最大限度的考虑了 C 字符串的兼容性,可以按照使用 C 字符串的方式使用 string 对象. 下来我们用 C 方式使用 string 类,看看示例代码 #include <iostream> #include <string> using namespace std; int main() {     string 

C++中前置操作符和后置操作符的重载

1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: 2,++i  // i 自增 1,i 的值作为返回值: 3,没有使用返回值,由于编译器(不同的编译器都是一样的)的优化,在工程上面,这两行代码没有区别: 2,真的有区别吗?编程实验: 1,main.cpp 文件: 1 #include <iostream> 2 #include <stri

C++学习之路: 特殊操作符-&gt;的重载

转自:http://blog.csdn.net/custa/article/details/5674434 primer 书上对重载该操作符的解释过于简单,但是总结性十分强: 重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象. 如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象获取指定成员.如果被指向的类型没有定义那个成员,则编译器产生一个错误. 如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符.编译器检

对操作符的重载和转换操作符--------------c#

这种写法能 自由自在的使用 加减乘除等操作符: 先定义一个类 public sealed class chongzai { public Int32 canshu1; //重载操作符 + ,参数必须包含一个以上当前的类型chongzai. public static Int32 operator +(chongzai s, Int32 c) { return (s.canshu1 + c); } //转换操作符,,,可以用=号,将string转换成 chongzai类型,这个implicit是隐

增量操作符的重载

++增量互有前增量和后增量区别,重载操作符时,虽然函数名相同,但是应有相应的区别.对于一个整型变量前增量操作符的结果与返回值变量是一致的,而后增量操作符返回的是一个临时变量.于是在增量操作符重载时也需要有前增量与后增量的区分. 前增量操作对象与返回对象是同一个变量,在反应对象的前增量操作时,要求参数为对象的引用,返回值也是对象的引用: className& operator++() ://前增量操作符设置为类成员函数 friend className& operator++(classNa