나는 게으름 뱅이를 보여 주며 모든 것을 저에게 보여주기 위해 실수를했습니다. 아래 코드에서 연산자 오버로딩에 대해 배우고 싶습니다. 이 코드는 메인 프로그램이 코드에서 연산자 오버로드가 어떻게 작동합니까?
static public explicit operator Int32(Vector v)
{
return v.Length;
}
public override string ToString()
{
String res = "<";
for (int i = 0; i < elements.Length; i++)
res += " " + elements[i];
res += " >";
return res;
}
public override bool Equals(Object v)
{
return (this == (Vector)v);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
코드에서 무엇을하고 있는지하는 것은 벡터와 평등/불평등 사업자의 덧셈, 뺄셈, 곱셈의 작업을 대체하여, 벡터의 클래스를 구현합니다. 하나의 피연산자 (실수 또는 정수) 연산을 고려하십시오. 연산에서 차원 벡터가 일치하는 경우 예외를 throw합니다.
namespace ConsoleApplication3
{
public class Vector
{
private Double[] elements;
public Vector()
{
this.elements = null;
}
public Vector(Int32 size)
{
if (size < 0) throw new Exception("Invalid vetors size");
elements = new Double[size];
}
public Vector(params Double[] elements)
{
this.elements = elements;
}
public Vector(Vector v)
{
this.elements = v.elements;
}
public int Length
{
get
{
if (elements == null) return 0;
return elements.Length;
}
}
public Double this[int index]
{
get
{
return elements[index];
}
set
{
elements[index] = value;
}
}
static public Vector operator+(Vector v1, Vector v2)
{
if (v1.Length != v2.Length)
throw new Exception("size of vectors are different");
Vector res = new Vector(v1.Length);
for (int i = 0; i < res.Length; i++)
res[i] = v1[i] + v2[i];
return res;
}
static public Vector operator+(Vector v, Double d)
{
Vector res = new Vector(v.Length);
for (int i = 0; i < v.Length; i++)
res[i] = v[i] + d;
return res;
}
static public Vector operator +(Double d, Vector v)
{
return (v + d);
}
static public Vector operator -(Vector v, Double d)
{
Vector res = new Vector(v.Length);
for (int i = 0; i < v.Length; i++)
res[i] = v[i] - d;
return res;
}
static public Vector operator -(Double d, Vector v)
{
Vector res = new Vector(v.Length);
for (int i = 0; i < v.Length; i++)
res[i] = d - v[i];
return res;
}
static public Vector operator *(Vector v, Double d)
{
Vector res = new Vector(v.Length);
for (int i = 0; i < v.Length; i++)
res[i] = v[i] * d;
return res;
}
static public Vector operator *(Double d, Vector v)
{
return (v * d);
}
static public Vector operator -(Vector v1, Vector v2)
{
if (v1.Length != v2.Length)
throw new Exception("size of vectors are different");
Vector res = new Vector(v1.Length);
for (int i = 0; i < res.Length; i++)
res[i] = v1[i] - v2[i];
return res;
}
static public Vector operator *(Vector v1, Vector v2)
{
if (v1.Length != v2.Length)
throw new Exception("size of vectors are different");
Vector res = new Vector(v1.Length);
for (int i = 0; i < res.Length; i++)
res[i] = v1[i] * v2[i];
return res;
}
static public Boolean operator ==(Vector v1, Vector v2)
{
if (v1.Length != v2.Length)
return false;
for (int i = 0; i < v1.Length; i++)
if(v1[i] != v2[i]) return false;
return true;
}
static public Boolean operator !=(Vector v1, Vector v2)
{
return (!(v1 == v2));
}
static public explicit operator Int32(Vector v)
{
return v.Length;
}
public override string ToString()
{
String res = "<";
for (int i = 0; i < elements.Length; i++)
res += " " + elements[i];
res += " >";
return res;
}
public override bool Equals(Object v)
{
return (this == (Vector)v);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
class Program
{
static void Main(string[] args)
{
Vector v1 = new Vector(new Double[]{1, 2, 3, 4});
Vector v2 = new Vector(2, 3, 4, 5);
Console.WriteLine(v1 + " + " + v2 + " = " + (v1 + v2));
Console.WriteLine(v1 + " - " + v2 + " = " + (v1 - v2));
Console.WriteLine(v1 + " * " + v2 + " = " + (v1 * v2));
Console.WriteLine(v1 + " * " + 7 + " = " + (v1 * 7));
Console.ReadKey(true);
}
}
}
무엇이 질문입니까? – Matthew
이 코드에서 연산자 오버로드가 expecially 작동하는 방법 – user1722962
@ user1722962 : 약 200 줄의 코드를 게시했습니다. 오페라 오버로딩이 혼란 스럽다는 것을 입증하는 * * * 예제를 게시하십시오. 또한 당신에게 혼란을주는 것을 정확히 말해주십시오. 그렇지 않으면이 질문은 대답하기에 너무 모호합니다. 아마도 문서에서 이미 읽었던 것과 같은 종류의 것을 쓸 것입니다. –