>  기사  >  백엔드 개발  >  C# 연산자 오버로딩

C# 연산자 오버로딩

黄舟
黄舟원래의
2017-02-06 16:28:261052검색

C#에 내장된 연산자를 재정의하거나 오버로드할 수 있습니다. 따라서 프로그래머는 사용자 정의 유형의 연산자를 사용할 수도 있습니다. 오버로드된 연산자는 키워드 연산자와 연산자 기호로 정의되는 특별한 이름을 가진 함수입니다. 다른 함수와 마찬가지로 오버로드된 연산자에는 반환 유형과 매개변수 목록이 있습니다.

예를 들어 다음 함수를 생각해 보세요.

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에 대해 더하기 연산자(+)를 구현합니다. 두 Box 객체의 속성을 추가하고 추가된 Box 객체를 반환합니다.

연산자 오버로딩 구현

다음 프로그램은 완전한 구현을 보여줍니다.

using System;namespace OperatorOvlApplication{   
class Box   {      
private double length;      // 长度      
privatedouble breadth;     // 宽度      
private double height;      // 高度      
public double getVolume()      
{         
return length * breadth * height;      
}      
public void setLength( double len )      
{         
length = len;      
}      
public void setBreadth(double bre )      
{         
breadth = bre;      
}      
public void setHeight( double hei )      
{         
height = hei;      
}      
// 重载 + 运算符来把两个 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;      
 }   
 }   
 class Tester   
 {      
 static void Main(string[] args)      
 {         
 Box Box1 = new Box();         
 // 声明 Box1,类型为 Box         
 Box Box2 = new Box();         
 // 声明 Box2,类型为 Box         
 Box Box3 = new Box();         
 // 声明 Box3,类型为 Box         
 double volume = 0.0;          
 // 体积         
 // Box1 详述         
 Box1.setLength(6.0);         
 Box1.setBreadth(7.0);         
 Box1.setHeight(5.0);         
 // Box2 详述         
 Box2.setLength(12.0);         
 Box2.setBreadth(13.0);         
 Box2.setHeight(10.0);         
 // Box1 的体积         
 volume = Box1.getVolume();         
 Console.WriteLine("Box1 的体积: {0}", volume);         
 // Box2 的体积         
 volume = Box2.getVolume();         
 Console.WriteLine("Box2 的体积: {0}", volume);         
 // 把两个对象相加         
 Box3 = Box1 + Box2;         
 // Box3 的体积         
 volume = Box3.getVolume();         
 Console.WriteLine("Box3 的体积: {0}", volume);         
 Console.ReadKey();      
 }   
 }
 }

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Box1 的体积: 210 Box2 的体积: 1560 Box3 的体积: 5400

오버로드 가능 및 오버로드 불가능 연산자

다음 표에서는 C#의 연산자 오버로드 기능을 설명합니다.

运算符 描述
+, -, !, ~, ++, -- 这些一元运算符只有一个操作数,且可以被重载。
+, -, *, /, % 这些二元运算符带有两个操作数,且可以被重载。
==, !=, 95ec6993dc754240360e28e0de8de30a, d2e24fbfa3a7d998970671c0359d3643= 这些比较运算符可以被重载
&&, || 这些条件逻辑运算符不能被直接重载。
+=, -=, *=, /=, %= 这些赋值运算符不能被重载。
=, ., ?:, ->, new, is, sizeof, typeof 这些运算符不能被重载。

위 논의에 대한 응답으로, 위의 예를 확장하여 더 많은 연산자를 오버로드해 보겠습니다.

using System;namespace OperatorOvlApplication{   
class Box    
{       
private double length;      // 长度       
privatedouble breadth;     // 宽度       
private double height;      // 高度             
public double getVolume()       {         
return length * breadth * height;       }      
public void setLength( double len )      {          
length = len;      }      
public void setBreadth( double bre )      {          breadth = bre;      }      
public void setHeight( double hei )      {          height = hei;      }      
// 重载 + 运算符来把两个 Box 对象相加      
public static Box operator+ (Box b, Box c)      {          
Box box = newBox();          
box.length = b.length + c.length;          
box.breadth = b.breadth + c.breadth;          
box.height = b.height + c.height;          
return box;      
}            
public static bool operator == (Box lhs, Box rhs)      {          
bool status = false;         
if (lhs.length == rhs.length && lhs.height == rhs.height             
&& lhs.breadth == rhs.breadth)          {              
status = true;          }         
 return status;      }      
public static bool operator !=(Box lhs, Box rhs)      {          
bool status = false;          
if (lhs.length != rhs.length || lhs.height != rhs.height              
|| lhs.breadth != rhs.breadth)          {              
status = true;          }          
return status;      }      
public static bool operator <(Box lhs, Box rhs)      {          
bool status =false;          
if (lhs.length < rhs.length && lhs.height              
< rhs.height && lhs.breadth < rhs.breadth)          {              
status = true;          }          
return status;      }      
public static bool operator >(Box lhs, Box rhs)      {          
bool status =false;          if (lhs.length > rhs.length && lhs.height             
 > rhs.height && lhs.breadth > rhs.breadth)          {              
 status = true;          }          return status;      }      
 public static bool operator <=(Box lhs, Box rhs)      {          
 bool status = false;          
 if (lhs.length <= rhs.length && lhs.height             
  <= rhs.height && lhs.breadth <= rhs.breadth)          {              
 status = true;          }          return status;      }     
  public static bool operator >=(Box lhs, Box rhs)      {          bool status = false;          
  if (lhs.length >= rhs.length && lhs.height             >= rhs.height && lhs.breadth >= rhs.breadth)          
  {              status = true;          }          return status;      }      
  public override string ToString()      {          
  returnString.Format("({0}, {1}, {2})", length, breadth, height);      }     
  }      
   class Tester   {      
   static void Main(string[] args)      {       
   Box Box1 = new Box();          
   // 声明 Box1,类型为 Box        
   Box Box2 = new Box();          
   // 声明 Box2,类型为 Box       
    Box Box3 = new Box();          
    // 声明 Box3,类型为 Box        
    Box Box4 = new Box();        
    double volume = 0.0;   
    // 体积        
    // Box1 详述        
    Box1.setLength(6.0);        
    Box1.setBreadth(7.0);        
    Box1.setHeight(5.0);        
    // Box2 详述        
    Box2.setLength(12.0);        
    Box2.setBreadth(13.0);        
    Box2.setHeight(10.0);       
    // 使用重载的 ToString() 显示两个盒子        
    Console.WriteLine("Box1: {0}", Box1.ToString());        
    Console.WriteLine("Box2: {0}", Box2.ToString());                
    // Box1 的体积        
    volume = Box1.getVolume();        
    Console.WriteLine("Box1 的体积: {0}", volume);        
    // Box2 的体积       
    volume = Box2.getVolume();        
    Console.WriteLine("Box2 的体积: {0}", volume);        
    // 把两个对象相加        
    Box3= Box1 + Box2;        
    Console.WriteLine("Box3: {0}", Box3.ToString());        
    // Box3 的体积        
    volume =Box3.getVolume();        
    Console.WriteLine("Box3 的体积: {0}", volume);        
    //comparing the boxes        
    if (Box1 >Box2)          
    Console.WriteLine("Box1 大于 Box2");        
    else          
    Console.WriteLine("Box1 不大于 Box2");        
    if (Box1 <Box2)          
    Console.WriteLine("Box1 小于 Box2");        
    else          
    Console.WriteLine("Box1 不小于 Box2");        
    if (Box1>= Box2)          
    Console.WriteLine("Box1 大于等于 Box2");        
    else          
    Console.WriteLine("Box1 不大于等于 Box2");        
    if (Box1 <= Box2)          
    Console.WriteLine("Box1 小于等于 Box2");        
    else          
    Console.WriteLine("Box1 不小于等于 Box2");        
    if (Box1 != Box2)          
    Console.WriteLine("Box1 不等于 Box2");        
    else          
    Console.WriteLine("Box1 等于 Box2");        
    Box4 = Box3;        
    if (Box3 == Box4)          
    Console.WriteLine("Box3 等于 Box4");        
    else          
    Console.WriteLine("Box3 不等于 Box4");        
    Console.ReadKey();      
    }    
    }
    }

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Box1: (6, 7, 5) Box2: (12, 13, 10) Box1 的体积: 210 
Box2 的体积: 1560 Box3: (18, 20, 15) 
Box3 的体积: 5400 Box1 不大于 Box2 Box1 小于 Box2 Box1 不大于等于 Box2 Box1 小于等于 Box2 Box1 不等于 Box2 Box3 等于 Box4

위는 C# 작업입니다. 문자 오버로드에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.