zoukankan      html  css  js  c++  java
  • C#运算符重载

    运算符重载允许为运算指定用户定义的运算符实现,其中一个或两个操作数是用户定义的类或结构类型。用户定义的运算符实现的优先级总是高于预定义运算符实现:仅当没有适用的用户定义运算符实现时才会考虑预定义运算符实现。

    运算符

    可重载性

    +、-、!、~、++、--、true、false

    可以重载这些一元运算符。
      true和false运算符必须成对重载。

    +、-、*、/、%、&、|、^、<<、>>

    可以重载这些二元运算符。

    ==、!=、<、>、<=、>=

    可以重载比较运算符。必须成对重载。

    &&、||

    不能重载条件逻辑运算符。
      但可以使用能够重载的&和|进行计算。

    []

    不能重载数组索引运算符,但可以定义索引器。

    ()

    不能重载转换运算符,但可以定义新的转换运算符。

    +=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

    不能显式重载赋值运算符。
      在重写单个运算符如+、-、%时,它们会被隐式重写。

    =、.、?:、->、new、is、sizeof、typeof

    不能重载这些运算符。

     下面的例子中Vector结构表示一个三维矢量:

    复制代码
     1 using System;
     2 
     3 namespace ConsoleApplication19
     4 {
     5     class Program
     6     {
     7         static void Main(string[] args)
     8         {
     9             Vector vect1, vect2, vect3;
    10             vect1 = new Vector(3.0, 3.0, 1.0);
    11             vect2 = new Vector(2.0, -4.0, -4.0);
    12             vect3 = vect1 + vect2;
    13 
    14             Console.WriteLine("vect1=" + vect1.ToString());
    15             Console.WriteLine("vect2=" + vect2.ToString());
    16             Console.WriteLine("vect3=" + vect3.ToString());
    17             Console.ReadLine();
    18         }
    19     }
    20 
    21     struct Vector
    22     {
    23         public double x, y, z;
    24 
    25         public Vector(double x, double y, double z)
    26         {
    27             this.x = x;
    28             this.y = y;
    29             this.z = z;
    30         }
    31 
    32         public Vector(Vector rhs)
    33         
    34         {
    35             this.x = rhs.x;
    36             this.y = rhs.y;
    37             this.z = rhs.z;
    38         }
    39 
    40         public override string ToString()
    41         {
    42             return "(" + x + "," + y + "," + z + ")";
    43         }
    44 
    45         public static Vector operator +(Vector lhs, Vector rhs)
    46         {
    47             Vector result = new Vector(lhs);
    48             result.x += rhs.x;
    49             result.y += rhs.y;
    50             result.z += rhs.z;
    51             return result;
    52         }
    53     }
    54 }
    复制代码

    输出:

    • 运算符重载的声明方式:operator关键字告诉编译器,它实际上是一个运算符重载,后面是相关运算符的符号
    • 对于二元运算符,第一个参数是放在运算符左边的值,一般命名为lhs;第二个参数是放在运算符右边的值,一般命名为rhs
    • C#要求所有的运算符重载都声明为public和static,这表示它们与它们的类或结构相关联,而不是与实例相关联。

    添加重载乘法运算符:

    1         public static Vector operator *(double lhs, Vector rhs)
    2         {
    3             return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
    4         }

    如果a和b声明为Vector类型,就可以编写代码:b=2*a; 编译器会隐式的把整数2转换为double类型,但是不能编译代码:b=a*2;

    比较运算符的重载

    • C#要求成对重载比较运算符,如果重载了==,也必须重载!=,否在会产生编译错误。
    • 比较运算符必须返回bool类型的值
    • 注意:在重载==和!=时,还应该重载从System.Object中继承的Equals()和GetHashCode()方法,否则会产生一个编译警告,原因是Equals方法应执行与==运算符相同的相等逻辑。

    下面给Vector结构重载==和!=运算符:

    复制代码
     1         public static bool operator ==(Vector lhs, Vector rhs)
     2         {
     3             if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)
     4             {
     5                 return true;
     6             }
     7             else
     8             {
     9                 return false;
    10             }
    11         }
    复制代码
    1         public static bool operator !=(Vector lhs, Vector rhs)
    2         {
    3             return !(lhs == rhs);
    4         }

    重载True和False运算符:

    复制代码
     1 using System;
     2 
     3 namespace ConsoleApplication20
     4 {
     5     class Program
     6     {
     7         static void Main(string[] args)
     8         {
     9             // 输出20以内的所有素数
    10             for (uint i = 2; i <= 20; i++)
    11             {
    12                 Prime p = new Prime(i);
    13                 if (p)
    14                 { 
    15                     Console.Write(i + " ");
    16                 }
    17             }
    18             Console.ReadLine();
    19         }
    20     }
    21 
    22     public struct Prime
    23     {
    24         private uint value;
    25         public Prime(uint value)
    26         {
    27             this.value = value;
    28         }
    29 
    30         public static bool operator true(Prime p)
    31         {
    32             return IsPrime(p.value);
    33         }
    34 
    35         public static bool operator false(Prime p)
    36         {
    37             return !(IsPrime(p.value));
    38         }
    39 
    40         public static bool IsPrime(uint value)
    41         {
    42             for (uint i = 2; i <= value / 2; i++)
    43             {
    44                 if (value % i == 0)
    45                 {
    46                     return false;
    47                 }
    48             }
    49             return true;
    50         }
    51 
    52         public override string ToString()
    53         {
    54             return ("" + value);
    55         }
    56     }
    57 }
    复制代码

    输出:

    复制代码
     1 using System;
     2 
     3 namespace ConsoleApplication21
     4 {
     5     class Program
     6     {
     7         static void Main(string[] args)
     8         {
     9             DBBool b;
    10             b = DBBool.dbTrue;
    11             if (b)
    12             {
    13                 Console.WriteLine("b is definitely true");
    14             }
    15             else
    16             {
    17                 Console.WriteLine("b is not definitely true");
    18             }
    19             Console.ReadLine();
    20         }
    21     }
    22 
    23     public struct DBBool
    24     {
    25         public static readonly DBBool dbNull = new DBBool(0);
    26         public static readonly DBBool dbFalse = new DBBool(-1);
    27         public static readonly DBBool dbTrue = new DBBool(1);
    28 
    29         int value;
    30 
    31         DBBool(int value)
    32         {
    33             this.value = value;
    34         }
    35 
    36         public static bool operator true(DBBool x)
    37         {
    38             return x.value > 0;
    39         }
    40 
    41         public static bool operator false(DBBool x)
    42         {
    43             return x.value < 0;
    44         }
    45     }
    46 }
    复制代码

    输出:

  • 相关阅读:
    Android OpenGL ES 2.0 (四) 灯光perfragment lighting
    Android OpenGL ES 2.0 (五) 添加材质
    冒泡排序函数
    javascript object 转换为 json格式 toJSONString
    Liunx CentOS 下载地址
    jquery 图片切换特效 鼠标点击左右按钮焦点图切换滚动
    javascript 解析csv 的function
    mysql Innodb Shutdown completed; log sequence number解决办法
    Centos 添加 yum
    javascript 键值转换
  • 原文地址:https://www.cnblogs.com/w-wfy/p/7152666.html
Copyright © 2011-2022 走看看