Surcharge d'opérateurs : tutorial

Description

Voici une petite source montrant comment surcharger un opérateur du type +, *, ... pour par exemple additioner deux objets d'une classe, ...

Pour cela j'ai pris l'exemple des nombres complexes ( partie réel, partie imaginaire )

Source / Exemple :


Below or in the zip

// project created on 27/11/2002 at 16:55
using System;

class MainClass
{
	public static void Main(string[] args)
	{
		ClpComplexe C1 = new ClpComplexe();
		ClpComplexe C2 = new ClpComplexe(5,3);
				
		C1.Reel = 2;
		C1.Imaginaire = -4;		
		Console.Out.WriteLine("C1: " + C1.Reel + "+" + C1.Imaginaire + "j");
		Console.Out.WriteLine("C2: " + C2.Reel + "+" + C2.Imaginaire + "j\n");
				
		//Opération possible grâce à la surcharge de l'opérateur +
		//ClpComplexe + ClpComplexe
		ClpComplexe C3 = C1 + C2;
		
		Console.Out.WriteLine("Old C1: " + C1.Reel + "+" + C1.Imaginaire + "j");
		
		//ClpComplexe + ClpComplexe
		C1 = C2 + C3;
		//ClpComplexe * ClpComplexe
		ClpComplexe C4 = C2 * C3;
		//ClpComplexe - Complexe où Complexe est un ClpComplexe déterminé par (int * ClpComplexe)
		C4 = C4 - (2 * C1);
		//Idem mais avec inversion des arguments
		//ClpComplexe - Complexe où Complexe est un ClpComplexe déterminé par (ClpComplexe * int)
		C4 = C4 - (C1 * 2);
		
		Console.Out.WriteLine("C1: " + C1.Reel + "+" + C1.Imaginaire + "j");
		Console.Out.WriteLine("C2: " + C2.Reel + "+" + C2.Imaginaire + "j");
		Console.Out.WriteLine("C3: " + C3.Reel + "+" + C3.Imaginaire + "j");
		Console.Out.WriteLine("C4: " + C4.Reel + "+" + C4.Imaginaire + "j");
	}
}

class ClpComplexe
{
	private int iReel;
	private int iImaginaire;	
	
	//Constructeur par défaut
	public ClpComplexe()
	{
		this.iReel = 0;
		this.iImaginaire = 0;		
	}
	
	//Constructeur avec deux arguments
	public ClpComplexe(int iReel, int iImaginaire)
	{
		this.iReel = iReel;
		this.iImaginaire = iImaginaire;
	}
	
	//Propriété Reel
	public int Reel
	{
		get
		{
			return this.iReel;
		}
		set
		{
			this.iReel = value;
		}		
	}
	
	//Propriété Imaginaire
	public int Imaginaire
	{
		get
		{
			return this.iImaginaire;
		}
		set
		{
			this.iImaginaire = value;
		}		
	}
	
	//Surcharge de l'opérateur + pour pouvoir additionner deux nombres complexes
	public static ClpComplexe operator +(ClpComplexe C1, ClpComplexe C2)
	{
		return new ClpComplexe(C1.Reel + C2.Reel, C1.Imaginaire + C2.Imaginaire);
	}
	
	//Surcharge de l'opérateur - pour pouvoir soustriare deux nombres complexes
	public static ClpComplexe operator -(ClpComplexe C1, ClpComplexe C2)
	{
		return new ClpComplexe(C1.Reel - C2.Reel, C1.Imaginaire - C2.Imaginaire);
	}
	
	//Surcharge de l'opérateur * pour pouvoir multiplier deux nombres complexes
	public static ClpComplexe operator *(ClpComplexe C1, ClpComplexe C2)
	{
		return new ClpComplexe((C1.Reel * C2.Reel - C1.Imaginaire * C2.Imaginaire),
		                       (C1.Reel * C2.Imaginaire - C2.Reel * C1.Imaginaire));
	}
	
	//Surcharge de l'opérateur * pour pouvoir multiplier par iMultiple un nombre complexe
	public static ClpComplexe operator *(int iMultiple, ClpComplexe C1)
	{
		return new ClpComplexe((iMultiple * C1.Reel), (iMultiple * C1.Imaginaire));
	}
	
	//Surcharge de l'opérateur * pour pouvoir multiplier par iMultiple un nombre complexe
	public static ClpComplexe operator *(ClpComplexe C1, int iMultiple)
	{
		return new ClpComplexe((iMultiple * C1.Reel), (iMultiple * C1.Imaginaire));
	}
}

Conclusion :


Avec :

class ClpComplexe
{
public int iReel;
public int iImaginaire;
}

si je fais C3 = C1 + C2; //où C1, C2 & C3 sont des objets ClpComplexe
alors cela ne marche pas car le programme ne sait pas comment additionner deux nombres complexes alors avec la surcharge de l'opérateur +, cela est possible.

//Surcharge de l'opérateur + pour pouvoir additionner deux nombres complexes
public static ClpComplexe operator +(ClpComplexe C1, ClpComplexe C2)
{
return new ClpComplexe(C1.Reel + C2.Reel, C1.Imaginaire + C2.Imaginaire);
}

De sorte qu'il sache comment additionner deux nombres complexes.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.