#include <iostream>
#include <fstream>
#include <cmath>

using namespace std ;

// Déclaration (et définition) de la class `Matrice2x2', une classe pour des
// matrices de dimension 2 x 2.
class Matrice2x2 {
	// Champs (privés) de la classe ; il s'agit des quatre éléments de la matrice.
	double m_x11 ;
	double m_x12 ;
	double m_x21 ;
	double m_x22 ;
	public :
	// Constructeur avec les quatre éléments de la matrice.
	// Ce constructeur s'utilise, par exemple, comme suit :
	//        Matrice2x2 A(1.1, 1.2, 2.1, 2.2) ;
	// et la matrice est
	//        A = (1.1 1.2)
	//            (2.1 2.2)
	// Le compilateur offre en plus le constructeur de copie :
	//        Matrice2x2 B(A) ;
	// où tous les champs de `A' sont recopiés dans `B'.
	Matrice2x2(double x11, double x12, double x21, double x22) {
		m_x11 = x11 ;
		m_x12 = x12 ;
		m_x21 = x21 ;
		m_x22 = x22 ;
	}
	// Méthode pour afficher sur le flux de sortie standard la matrice.
	void afficher() const {
		cout << '[' << m_x11 << ", " << m_x12 << '\n' << m_x21 << ", " << m_x22 << "]\n" ;
	}
	// Méthode pour ajouter un scalaire à une matrice.
	// Cette méthode s'utilise comme suit :
	//         A.plus(3.14)
	Matrice2x2 plus(double s) {
		Matrice2x2 tmp(*this) ;
		tmp.m_x11 += s ;
		tmp.m_x12 += s ;
		tmp.m_x21 += s ;
		tmp.m_x22 += s ;
		return tmp ;
	}
	// Méthode-opérateur pour ajouter un scalaire à une matrice.
	// Cette méthode s'utilise comme suit :
	//         A + 3.14
	Matrice2x2 operator+(double s) {
		Matrice2x2 tmp(*this) ;
		tmp.m_x11 += s ;
		tmp.m_x12 += s ;
		tmp.m_x21 += s ;
		tmp.m_x22 += s ;
		return tmp ;
	}
} ;

int main() {

	Matrice2x2 A(1, 2, 3, 3) ;
	A.afficher() ;
	Matrice2x2 B(A) ;
	B.afficher() ;

	Matrice2x2 C(B.plus(2)) ;
	C.afficher() ;

	Matrice2x2 D(B + 2) ;
	D.afficher() ;

	return 0 ;
}
