📜  C#|运算符重载

📅  最后修改于: 2021-05-29 19:07:28             🧑  作者: Mango

先决条件:C#中的运算符

函数重载的概念也可以应用于运算符。运算符重载使您可以使用同一运算符执行各种操作。当将C#运算符应用于用户定义的数据类型时,它会提供其他功能。它允许对其中一个或两个操作数属于用户定义类的各种操作进行用户定义的实现。仅预定义的C#运算符可以重载。对用户定义的数据类型进行操作并不像对内置数据类型进行操作那么简单。要使用带有用户定义数据类型的运算符,必须根据程序员的要求对其进行重载。通过为操作员定义函数,可以使运算符超载。运算符的函数通过使用运算符关键字来声明。

句法 :

access specifier  className  operator Operator_symbol (parameters)
{
    // Code
}

注意:运算符重载基本上是一种向理想的C#运算符提供特殊含义的机制,该运算符具有用户定义的数据类型,例如结构或类。

下表描述了C#中可用的各种运算符的重载能力:

Operators Description
+, -, !, ~, ++, – – unary operators take one operand and can be overloaded.
+, -, *, /, % Binary operators take two operands and can be overloaded.
==, !=, = Comparison operators can be overloaded.
&&, || Conditional logical operators cannot be overloaded directly
+=, -+, *=, /=, %=, = Assignment operators cannot be overloaded.

重载一元运算符

返回类型可以是任何类型,但对于像!,〜,+和点(。)这样的一元运算运算符,除了void以外,其他类型都可以,但是返回类型必须是–和++运算符的’Type’类型,并且必须是布尔类型(true)以及错误的运算符。但是请记住,true和false运算符只能成对重载。如果一个类声明其中一个运算符而不声明另一个运算符,则会出现编译错误。

以下语法显示了Unary运算符的用法–

operator (object); 
here, operator is a symbol that denotes a unary operator. 
operator a; 

例子 :

Input : 15, -25
Output : -15, 25

Input : -22, 18
Output : 22, -18
// C# program to illustrate the
// unary operator overloading
using System;
namespace Calculator {
      
class Calculator {
      
    public int number1 , number2;
    public Calculator(int num1 , int num2)
    {
        number1 = num1;
        number2 = num2;
    }
      
// Function to perform operation
// By changing sign of integers
public static Calculator operator -(Calculator c1)
{
    c1.number1 = -c1.number1;
    c1.number2 = -c1.number2;
    return c1;
}
  
// Function to print the numbers
public void Print()
{
    Console.WriteLine ("Number1 = " + number1);
    Console.WriteLine ("Number2 = " + number2);
}
}
  
class EntryPoint
{
      
    // Driver Code
    static void Main(String []args)
    { 
          
        // using overloaded - operator 
        // with the class object
        Calculator calc = new Calculator(15, -25);
          
        calc = -calc;
          
        // To display the result
        calc.Print();
    }
}
}

输出 :

Number1 = -15
Number2 = 25

重载二元运算符

二进制运算符将使用两个操作数。二进制运算符的示例包括算术运算符(+,-,*,/,%),算术赋值运算符(+ =,-+,* =,/ +,%=)和关系运算符等。重载二进制运算符的方法类似重载一元运算运算符,只不过二元运算符需要一个附加参数。
句法 :

operator operator (object1, object2); 
Here, second "operator" is a symbol that 
denotes a binary operator. 
operator + (a, b); 

例子 :

Input : 200, 40
Output : 240

Input : 300, 20 
Output : 320 
// C# program to illustrate the
// Binary Operator Overloading 
using System;
namespace BinaryOverload {
      
class Calculator {
      
    public int number = 0;
      
    // no-argument constructor
    public Calculator() {}
      
      
    // parameterized constructor
    public Calculator(int n)
    {
        number = n;
    }
      
    // Overloading of Binary "+" operator
    public static Calculator operator + (Calculator Calc1, 
                                         Calculator Calc2)
    {
        Calculator Calc3 = new Calculator(0);
        Calc3.number = Calc2.number + Calc1.number;
        return Calc3;
    }
      
    // function to display result
    public void display()
    {
        Console.WriteLine("{0}", number);
    }
}
  
  
class CalNum {
      
    // Driver Code
    static void Main(string[] args)
    {
          
        Calculator num1 = new Calculator(200);
        Calculator num2 = new Calculator(40);
        Calculator num3 = new Calculator();
          
          
        num3 = num1 + num2;
          
        num1.display(); // Displays 200
          
        num2.display(); // Displays 40
          
        num3.display(); // Displays 240
          
    }
}
}

输出 :

200
40
240

操作员超载的好处:

  • 当运算符重载应用于用户定义的数据类型时,它们为C#运算符提供了附加功能。
  • 运算符可以被视为编译器内部的函数。