C# Operator Overloading

本文介绍了C#中运算符重载的概念与实现方法,包括一元和二元运算符的重载,并提供了具体的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

All unary and binary operators have pre-defined implementations, that are automatically available in any expressions. In addition to this pre-defined implementations, user defined implementations can also be introduced in C#. The mechanism of giving a special meaning to a standard C# operator with respect to a user defined data type such as classes or structures is known as operator overloading. Remember that it is not possible to overload all operators in C#. The following table shows the operators and their overloadability in C#.

Operators Overloadability

+, -, *, /, %, &, |, <<, >> All C# binary operators can be overloaded.

+, -, !, ~, ++, –, true, false All C# unary operators can be overloaded.

==, !=, <, >, <= , >= All relational operators can be overloaded, but only as pairs. The compilation error occurs if a class declares one of these operators without declaring the other.

&&, || They can’t be overloaded

() (Conversion operator) They can’t be overloaded

+=, -=, *=, /=, %= These compound assignment operators can be overloaded. But in C#, these operators are automatically overloaded when the respective binary operator is overloaded.

=, . , ?:, ->, new, is, as, size of These operators can’t be overloaded

In C#, a special function called operator function is used for overloading purpose. These special function or method must be public and static.They can take only value arguments.The ref and out parameters are not allowed as arguments to operator functions.(that meansthe normal param without keyword "ref" and "out") The general form of an operator function is as follows.

public static return_type operator op (argument list)
Where the op is the operator to be overloaded and operator is the required keyword. For overloading the unary operators, there is only one argument and for overloading a binary operator there are two arguments.Remember that at least one of the arguments must be a user-defined type such as class or struct type.

Overloading Unary Operators – the general form of operator function for unary operators is as follows.

public static return_type operator op (Type t)

{

  // Statements

}

Where Type must be a class or struct.The return type can be any type except void for unary operators like +,~, ! and dot (.). but the return type must be the type of ‘Type’ for ++

// Unary operator overloading

using System;

class Complex
{
    private int x;
    private int y;
    public Complex()
    {
    }
    public Complex(int i, int j)
    {
        x = i;
        y = j;
    }

    public void ShowXY()
    {
        Console.WriteLine(/”{0} {1}/”,x,y);
    }

    public static Complex operator -(Complex c) //重载负号(一元)运算符
    {
        Complex temp = new Complex();
        temp.x = -c.x;
        temp.y = -c.y;
        return temp;
    }
}

class MyClient
{
    public static void Main()
    {
        Complex c1 = new Complex(10,20);
        c1.ShowXY(); // displays 10 & 20
        Complex c2 = new Complex();
        c2.ShowXY(); // displays 0 & 0
        c2 = -c1;
        c2.ShowXY(); // diapls -10 & -20
    }
}

Overloading Binary Operators

An overloaded binary operator must take two arguments, at least one of them must be of the type class or struct, in which the operation is defined. But overloaded binary operators can return any value except the type void.The general form of a overloaded binary operator is as follows.

public static return_type operator op (Type1 t1, Type2 t2)
{
    //Statements
}

A concrete example is given below

// binary operator overloading

using System;

class Complex
{
    private int x;
    private int y;
    public Complex()
    {
    }
    public Complex(int i, int j)
    {
        x = i;
        y = j;
    }

    public void ShowXY()
    {
        Console.WriteLine(/”{0} {1}/”,x,y);
    }

    public static Complex operator +(Complex c1,Complex c2)
    {
        Complex temp = new Complex();
        temp.x = c1.x+c2.x;
        temp.y = c1.y+c2.y;
        return temp;
    }
}

class MyClient
{
    public static void Main()
    {
        Complex c1 = new Complex(10,20);
        c1.ShowXY(); // displays 10 & 20
        Complex c2 = new Complex(20,30);
        c2.ShowXY(); // displays 20 & 30
        Complex c3 = new Complex();
        c3 = c1 + c2;
        c3.ShowXY(); // dislplays 30 & 50
    }
}

The binary operators such as = =, ! =, <,>, < =, > = can be overloaded only as pairs. Remember that when a binary arithmetic operator is overloaded, corresponding assignment operators also get overloaded automatically. For example if we overload + operator, it implicitly overloads the + = operator also.

Summary

1.The user defined operator declarations can’t modify the syntax, precedence or associativity of an operator.For example, a + operator is always a binary operator having a predefined precedence and an associativity of left to right.
2.User defined operator implementations are given preference over predefined implementations.
3.Operator overload methods can’t return void.
4.The operator overload methods can be overloaded just like any other methods in C#.
The overloaded methods should differ in their type of arguments and/or number of arguments and/or order of arguments.Remember that in this case also the return type is not considered as part of the method signature.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值