C# 的运算符重载:隐式类型转换

文章目录

      • 类型转换是什么?
      • 函数重载是什么?
      • 运算符重载是什么?
      • 重载加法运算符
      • 重载类型转换运算符

类型转换是什么?

类型转换就是把数据从一种类型转换为另一种类型。在 C# 中,类型转换有两种形式:

  • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。

下面的实例显示了一个显式的类型转换:

namespace TypeConversionApplication
{
    class ExplicitConversion
    {
        static void Main(string[] args)
        {
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();
           
        }
    }
}

C#提供了一系列内置的类型转换方法:

  • ToBoolean
  • ToByte
  • ToChar
  • ToDateTime
  • ToDecimal
  • ToDouble
  • ToInt16
  • ToInt32
  • ToInt64
  • ToSbyte
  • ToSingle
  • ToString
  • ToType
  • ToUInt16
  • ToUInt32
  • ToUInt64

函数重载是什么?

重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。

重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

运算符重载是什么?

您可以重定义或重载 C# 中内置的运算符。

因此,程序员也可以使用用户自定义类型的运算符。

运算符重载的其实就是函数重载。首先通过指定的运算表达式调用对应的运算符函数,然后再将运算对象转化为运算符函数的实参,接着根据实参的类型来确定需要调用的函数的重载,这个过程是由编译器完成。

重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。

operator 关键字用于在类或结构声明中声明运算符。运算符声明可以采用下列四种形式之一:

//重载内置运算符
public static result-type operator unary-operator ( op-type operand )
public static result-type operator binary-operator ( op-type operand, op-type2 operand2 )

//转换运算符

//隐式类型转换
public static implicit operator conv-type-out ( conv-type-in operand )
//显式类型转换
public static explicit operator conv-type-out ( conv-type-in operand )

前两种形式声明了用户定义的重载内置运算符的运算符。后两种形式声明了转换运算符。

参数:

  • result-type 运算符的结果类型。
  • unary-operator 可重载的一元运算符:+ - ! ~ ++ - - true false
  • op-type 第一个(或唯一一个)参数的类型。
  • operand 第一个(或唯一一个)参数的名称。
  • binary-operator 可重载的二元运算符:+ - * / % & | ^ << >> == != > < >= <=
  • op-type2 第二个参数的类型。
  • operand2 第二个参数的名称。
  • conv-type-out 类型转换运算符的目标类型。
  • conv-type-in 类型转换运算符的输入类型。

C# 的运算符重载:隐式类型转换_第1张图片

重载加法运算符

public static result-type operator binary-operator ( op-type operand, op-type2 operand2 )

根据第二种声明方式,编码如下:

重载加法运算符,两个参数都是Box类型,返回值也是Box类型。

public static Box operator+ (Box b, Box c)
{
   Box box = new Box();
   box.length = b.length + c.length;
   box.breadth = b.breadth + c.breadth;
   box.height = b.height + c.height;
   return box;
}

调用重载的运算符:

Box box1 = new Box();
Box box2 = new Box();
Box box3 = box1 + box2;

重载类型转换运算符

implicit 关键字用于声明隐式的用户定义类型转换运算符。explicit则是显式。

根据第三种声明方式,编码如下:

class Digit
{
    public Digit(double d) { val = d; }
    public double val;
    // ...other members

    // User-defined conversion from Digit to double
    public static implicit operator double(Digit d)
    {
        return d.val;
    }
    //  User-defined conversion from double to Digit
    public static implicit operator Digit(double d)
    {
        return new Digit(d);
    }
}

调用重载的运算符:

class Program
{
    static void Main(string[] args)
    {
        Digit dig = new Digit(7);
        //This call invokes the implicit "double" operator
        double num = dig;
        //This call invokes the implicit "Digit" operator
        Digit dig2 = 12;
        Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
        Console.ReadLine();
    }
}

你可能感兴趣的:(编程语言)