Object-Oriented Programming C++

PART A: GENERALITIES

Presentation

The "Object-Oriented Programming C++" course provided a comprehensive introduction to object-oriented programming using C++. This course was essential for developing modern software applications with emphasis on code reusability, maintainability, and efficient memory management. C++ combines the power of low-level programming with high-level object-oriented features.

Academic Year: 2023-2024
Semester: 7
Category: Programming


PART B: DESCRIPTIVE PART

Course Materials:

Part 1 (PDF) | Part 2 (PDF) | Part 3 (PDF) | Part 4 (PDF) | Part 5 (PDF) | Part 6 (PDF) | Part 7 (PDF)

Experience Details

Environment and Context

The course covered both theoretical concepts and practical implementation of object-oriented programming in C++. We used modern C++ development environments and worked on progressively complex projects that demonstrated the power and flexibility of OOP principles in C++.

My Function

In this course, I was responsible for:

  • Understanding core OOP concepts (encapsulation, inheritance, polymorphism)
  • Implementing classes and objects in C++
  • Managing memory allocation and deallocation
  • Using templates and the Standard Template Library (STL)
  • Applying design patterns in C++ applications
  • Debugging and optimizing C++ code

PART C: TECHNICAL PART

This section explores the technical aspects of object-oriented programming in C++.

Technical Concepts Learned

1. Classes and Objects

The foundation of OOP in C++:

Class Definition:

class Rectangle {
private:
    double width;
    double height;

public:
    // Constructor
    Rectangle(double w, double h) : width(w), height(h) {}

    // Member functions
    double area() const {
        return width * height;
    }

    double perimeter() const {
        return 2 * (width + height);
    }

    // Getters and setters
    void setWidth(double w) { width = w; }
    double getWidth() const { return width; }
};

Key Concepts:

  • Encapsulation: Data hiding using private/protected/public access specifiers
  • Constructor/Destructor: Object initialization and cleanup
  • Member Functions: Methods that operate on object data
  • Const Correctness: Using const for read-only operations

2. Constructors and Destructors

Special member functions for object lifecycle management:

class DynamicArray {
private:
    int* data;
    size_t size;

public:
    // Default constructor
    DynamicArray() : data(nullptr), size(0) {}

    // Parameterized constructor
    DynamicArray(size_t n) : size(n) {
        data = new int[size];
    }

    // Copy constructor
    DynamicArray(const DynamicArray& other) : size(other.size) {
        data = new int[size];
        std::copy(other.data, other.data + size, data);
    }

    // Move constructor (C++11)
    DynamicArray(DynamicArray&& other) noexcept
        : data(other.data), size(other.size) {
        other.data = nullptr;
        other.size = 0;
    }

    // Destructor
    ~DynamicArray() {
        delete[] data;
    }

    // Copy assignment operator
    DynamicArray& operator=(const DynamicArray& other) {
        if (this != &other) {
            delete[] data;
            size = other.size;
            data = new int[size];
            std::copy(other.data, other.data + size, data);
        }
        return *this;
    }
};

Rule of Three/Five: If you need to define a custom destructor, copy constructor, or copy assignment operator, you likely need all three (or five with move semantics).

3. Inheritance

Inheritance and polymorphism C++

Figure: Inheritance and polymorphism in C++ - Animal base class and derived classes

Code reuse through class hierarchies:

class Shape {
protected:
    std::string color;

public:
    Shape(const std::string& c) : color(c) {}
    virtual ~Shape() {}  // Virtual destructor

    virtual double area() const = 0;  // Pure virtual function
    virtual void draw() const {
        std::cout << "Drawing a " << color << " shape\n";
    }
};

class Circle : public Shape {
private:
    double radius;

public:
    Circle(const std::string& c, double r)
        : Shape(c), radius(r) {}

    double area() const override {
        return M_PI * radius * radius;
    }

    void draw() const override {
        std::cout << "Drawing a " << color << " circle\n";
    }
};

class Rectangle : public Shape {
private:
    double width, height;

public:
    Rectangle(const std::string& c, double w, double h)
        : Shape(c), width(w), height(h) {}

    double area() const override {
        return width * height;
    }
};

Inheritance Types:

  • Public Inheritance: Is-a relationship
  • Protected Inheritance: Implementation inheritance
  • Private Inheritance: Not commonly used

4. Polymorphism

Dynamic dispatch through virtual functions:

void printArea(const Shape& shape) {
    std::cout << "Area: " << shape.area() << std::endl;
    shape.draw();
}

int main() {
    Circle circle("red", 5.0);
    Rectangle rect("blue", 4.0, 6.0);

    printArea(circle);     // Calls Circle::area()
    printArea(rect);       // Calls Rectangle::area()

    // Polymorphic container
    std::vector<std::unique_ptr<Shape>> shapes;
    shapes.push_back(std::make_unique<Circle>("green", 3.0));
    shapes.push_back(std::make_unique<Rectangle>("yellow", 2.0, 5.0));

    for (const auto& shape : shapes) {
        shape->draw();
    }
}

Key Concepts:

  • Virtual Functions: Enable runtime polymorphism
  • Virtual Destructor: Essential for base classes
  • Pure Virtual Functions: Define abstract interfaces
  • Override Keyword: Explicit override declaration (C++11)

5. Operator Overloading

Defining custom behavior for operators:

class Complex {
private:
    double real, imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // Arithmetic operators
    Complex operator+(const Complex& other) const {
        return Complex(real + other.real, imag + other.imag);
    }

    Complex operator*(const Complex& other) const {
        return Complex(
            real * other.real - imag * other.imag,
            real * other.imag + imag * other.real
        );
    }

    // Comparison operator
    bool operator==(const Complex& other) const {
        return real == other.real && imag == other.imag;
    }

    // Stream operators (as friend functions)
    friend std::ostream& operator<<(std::ostream& os, const Complex& c) {
        os << c.real << " + " << c.imag << "i";
        return os;
    }

    friend std::istream& operator>>(std::istream& is, Complex& c) {
        is >> c.real >> c.imag;
        return is;
    }
};

6. Templates

Generic programming for code reusability:

// Function template
template<typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

// Class template
template<typename T>
class Stack {
private:
    std::vector<T> elements;

public:
    void push(const T& element) {
        elements.push_back(element);
    }

    T pop() {
        if (elements.empty()) {
            throw std::runtime_error("Stack is empty");
        }
        T value = elements.back();
        elements.pop_back();
        return value;
    }

    bool empty() const {
        return elements.empty();
    }

    size_t size() const {
        return elements.size();
    }
};

// Template specialization
template<>
class Stack<bool> {
    // Specialized implementation for bool
};

7. Standard Template Library (STL)

Powerful collection of generic containers and algorithms:

Containers:

// Sequential containers
std::vector<int> vec = {1, 2, 3, 4, 5};
std::list<std::string> lst;
std::deque<double> deq;

// Associative containers
std::map<std::string, int> ages;
ages["Alice"] = 25;
ages["Bob"] = 30;

std::set<int> unique_numbers = {1, 2, 3, 3, 4};  // {1, 2, 3, 4}

// Container adapters
std::stack<int> stack;
std::queue<int> queue;
std::priority_queue<int> pq;

Algorithms:

#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// Sorting
std::sort(numbers.begin(), numbers.end());

// Finding
auto it = std::find(numbers.begin(), numbers.end(), 8);

// Transforming
std::transform(numbers.begin(), numbers.end(), numbers.begin(),
               [](int n) { return n * 2; });

// Accumulating
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);

8. Smart Pointers (C++11)

Automatic memory management:

#include <memory>

// Unique pointer (exclusive ownership)
std::unique_ptr<int> ptr1 = std::make_unique<int>(42);

// Shared pointer (shared ownership)
std::shared_ptr<int> ptr2 = std::make_shared<int>(100);
std::shared_ptr<int> ptr3 = ptr2;  // Reference count = 2

// Weak pointer (non-owning reference)
std::weak_ptr<int> weak = ptr2;

// Example with classes
class MyClass {
public:
    MyClass() { std::cout << "Constructor\n"; }
    ~MyClass() { std::cout << "Destructor\n"; }
    void doSomething() { std::cout << "Doing something\n"; }
};

std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();
obj->doSomething();
// Destructor called automatically when obj goes out of scope

9. Exception Handling

Robust error management:

class FileNotFoundException : public std::exception {
private:
    std::string message;

public:
    FileNotFoundException(const std::string& filename)
        : message("File not found: " + filename) {}

    const char* what() const noexcept override {
        return message.c_str();
    }
};

void readFile(const std::string& filename) {
    try {
        std::ifstream file(filename);
        if (!file.is_open()) {
            throw FileNotFoundException(filename);
        }
        // Read file...
    } catch (const FileNotFoundException& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        throw;  // Re-throw
    } catch (const std::exception& e) {
        std::cerr << "Unexpected error: " << e.what() << std::endl;
    }
}

10. Design Patterns

Common software design solutions:

Singleton Pattern:

class Database {
private:
    static Database* instance;
    Database() {}  // Private constructor

public:
    static Database* getInstance() {
        if (instance == nullptr) {
            instance = new Database();
        }
        return instance;
    }

    void connect() {
        std::cout << "Connecting to database...\n";
    }
};

Factory Pattern:

class ShapeFactory {
public:
    static std::unique_ptr<Shape> createShape(const std::string& type) {
        if (type == "circle") {
            return std::make_unique<Circle>("red", 5.0);
        } else if (type == "rectangle") {
            return std::make_unique<Rectangle>("blue", 4.0, 6.0);
        }
        return nullptr;
    }
};

PART D: ANALYTICAL PART

Knowledge and Skills Mobilized

  • Understanding object-oriented programming principles
  • Implementing classes with proper encapsulation
  • Using inheritance and polymorphism effectively
  • Managing memory with RAII and smart pointers
  • Applying templates for generic programming
  • Utilizing STL containers and algorithms
  • Handling exceptions properly
  • Implementing design patterns
  • Debugging complex C++ programs

Self Evaluation

This course was challenging but rewarding. Coming from C programming, the shift to object-oriented thinking required significant mental adjustment. The concept of classes and objects was initially abstract, but through practical projects, I gained solid understanding.

Memory management in C++ (especially with pointers and dynamic allocation) was tricky. However, learning about RAII and smart pointers made memory management much more manageable and safer. The introduction of C++11 features like move semantics and lambda functions was particularly interesting.

Templates and the STL initially seemed overwhelming due to their complexity, but I came to appreciate their power for writing generic, reusable code. The error messages from template compilation errors were often cryptic and difficult to debug.

I found polymorphism and virtual functions fascinating, especially how they enable flexible and extensible software design. Implementing design patterns helped me understand professional software architecture.

My Opinion

C++ is a powerful but complex language. This course provided a solid foundation in OOP with C++, though mastering the language requires continuous practice. The course balanced theory with practical implementation well.

I particularly appreciated learning about modern C++ features (C++11/14/17). These features make C++ more user-friendly while maintaining its performance advantages. Understanding the relationship between C and C++ helped me appreciate when to use C++'s features versus C-style programming.

Areas I would have liked to explore more:

  • Multithreading and concurrency in C++
  • Template metaprogramming
  • More complex design patterns
  • Performance optimization techniques
  • Build systems and project organization

The projects helped solidify concepts, though more real-world applications (like embedded systems programming or game development) would have been valuable. Overall, this course equipped me with essential skills for modern software development.


Connected Bowl Project Illustrations

Class diagram of the Connected Bowl project

Figure: UML class diagram of the Connected Bowl project

Connected Bowl interface

Figure: Connected Bowl application - client interface

Server architecture of the Connected Bowl project

Figure: Server architecture of the Connected Bowl project


Reports and Projects

Connected Bowl Report

Report on the C++ object-oriented programming project: design and implementation of a connected bowl with client-server architecture.

Download the PDF report


Course Documents

Part 1 - C++ Basics

Introduction to C++: differences with C, compilation, input/output, references and memory management.

Download

Part 2 - Classes

Classes in C++: constructors, destructors, encapsulation, private/public members and methods.

Download

Part 3 - Inheritance

Inheritance in C++: derived classes, cascading constructors/destructors, protected access.

Download

Part 4 - Polymorphism

Polymorphism in C++: virtual functions, abstract classes, dynamic binding and virtual.

Download

Programmation Orientee Objets C++

PARTIE A : GENERALITES

Presentation

Le cours de "Programmation Orientee Objets C++" a fourni une introduction complete a la programmation orientee objet en utilisant C++. Ce cours etait essentiel pour developper des applications logicielles modernes avec un accent sur la reutilisabilite du code, la maintenabilite et la gestion efficace de la memoire. Le C++ combine la puissance de la programmation bas niveau avec les fonctionnalites orientees objet de haut niveau.

Annee universitaire : 2023-2024
Semestre : 7
Categorie : Programmation


PARTIE B : PARTIE DESCRIPTIVE

Supports de cours :

Partie 1 (PDF) | Partie 2 (PDF) | Partie 3 (PDF) | Partie 4 (PDF) | Partie 5 (PDF) | Partie 6 (PDF) | Partie 7 (PDF)

Details de l'experience

Environnement et contexte

Le cours couvrait a la fois les concepts theoriques et l'implementation pratique de la programmation orientee objet en C++. Nous avons utilise des environnements de developpement C++ modernes et travaille sur des projets de complexite croissante qui demontraient la puissance et la flexibilite des principes de la POO en C++.

Ma fonction

Dans ce cours, j'etais responsable de :

  • Comprendre les concepts fondamentaux de la POO (encapsulation, heritage, polymorphisme)
  • Implementer des classes et des objets en C++
  • Gerer l'allocation et la desallocation de memoire
  • Utiliser les templates et la Standard Template Library (STL)
  • Appliquer des patrons de conception dans des applications C++
  • Deboguer et optimiser du code C++

PARTIE C : PARTIE TECHNIQUE

Cette section explore les aspects techniques de la programmation orientee objet en C++.

Concepts techniques appris

1. Classes et objets

Le fondement de la POO en C++ :

Definition de classe :

class Rectangle {
private:
    double width;
    double height;

public:
    // Constructeur
    Rectangle(double w, double h) : width(w), height(h) {}

    // Fonctions membres
    double area() const {
        return width * height;
    }

    double perimeter() const {
        return 2 * (width + height);
    }

    // Accesseurs et mutateurs
    void setWidth(double w) { width = w; }
    double getWidth() const { return width; }
};

Concepts cles :

  • Encapsulation : Masquage des donnees a l'aide des specificateurs d'acces private/protected/public
  • Constructeur/Destructeur : Initialisation et nettoyage des objets
  • Fonctions membres : Methodes qui operent sur les donnees de l'objet
  • Correction const : Utilisation de const pour les operations en lecture seule

2. Constructeurs et destructeurs

Fonctions membres speciales pour la gestion du cycle de vie des objets :

class DynamicArray {
private:
    int* data;
    size_t size;

public:
    // Constructeur par defaut
    DynamicArray() : data(nullptr), size(0) {}

    // Constructeur parametre
    DynamicArray(size_t n) : size(n) {
        data = new int[size];
    }

    // Constructeur de copie
    DynamicArray(const DynamicArray& other) : size(other.size) {
        data = new int[size];
        std::copy(other.data, other.data + size, data);
    }

    // Constructeur de deplacement (C++11)
    DynamicArray(DynamicArray&& other) noexcept
        : data(other.data), size(other.size) {
        other.data = nullptr;
        other.size = 0;
    }

    // Destructeur
    ~DynamicArray() {
        delete[] data;
    }

    // Operateur d'affectation par copie
    DynamicArray& operator=(const DynamicArray& other) {
        if (this != &other) {
            delete[] data;
            size = other.size;
            data = new int[size];
            std::copy(other.data, other.data + size, data);
        }
        return *this;
    }
};

Regle des trois/cinq : Si vous devez definir un destructeur personnalise, un constructeur de copie ou un operateur d'affectation par copie, vous aurez probablement besoin des trois (ou cinq avec la semantique de deplacement).

3. Heritage

Heritage et polymorphisme C++

Figure : Heritage et polymorphisme en C++ - Classe de base Animal et classes derivees

Reutilisation du code a travers les hierarchies de classes :

class Shape {
protected:
    std::string color;

public:
    Shape(const std::string& c) : color(c) {}
    virtual ~Shape() {}  // Destructeur virtuel

    virtual double area() const = 0;  // Fonction virtuelle pure
    virtual void draw() const {
        std::cout << "Drawing a " << color << " shape\n";
    }
};

class Circle : public Shape {
private:
    double radius;

public:
    Circle(const std::string& c, double r)
        : Shape(c), radius(r) {}

    double area() const override {
        return M_PI * radius * radius;
    }

    void draw() const override {
        std::cout << "Drawing a " << color << " circle\n";
    }
};

class Rectangle : public Shape {
private:
    double width, height;

public:
    Rectangle(const std::string& c, double w, double h)
        : Shape(c), width(w), height(h) {}

    double area() const override {
        return width * height;
    }
};

Types d'heritage :

  • Heritage public : Relation est-un
  • Heritage protege : Heritage d'implementation
  • Heritage prive : Rarement utilise

4. Polymorphisme

Dispatch dynamique a travers les fonctions virtuelles :

void printArea(const Shape& shape) {
    std::cout << "Area: " << shape.area() << std::endl;
    shape.draw();
}

int main() {
    Circle circle("red", 5.0);
    Rectangle rect("blue", 4.0, 6.0);

    printArea(circle);     // Appelle Circle::area()
    printArea(rect);       // Appelle Rectangle::area()

    // Conteneur polymorphe
    std::vector<std::unique_ptr<Shape>> shapes;
    shapes.push_back(std::make_unique<Circle>("green", 3.0));
    shapes.push_back(std::make_unique<Rectangle>("yellow", 2.0, 5.0));

    for (const auto& shape : shapes) {
        shape->draw();
    }
}

Concepts cles :

  • Fonctions virtuelles : Permettent le polymorphisme a l'execution
  • Destructeur virtuel : Essentiel pour les classes de base
  • Fonctions virtuelles pures : Definissent des interfaces abstraites
  • Mot-cle override : Declaration explicite de redefinition (C++11)

5. Surcharge d'operateurs

Definition de comportements personnalises pour les operateurs :

class Complex {
private:
    double real, imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // Operateurs arithmetiques
    Complex operator+(const Complex& other) const {
        return Complex(real + other.real, imag + other.imag);
    }

    Complex operator*(const Complex& other) const {
        return Complex(
            real * other.real - imag * other.imag,
            real * other.imag + imag * other.real
        );
    }

    // Operateur de comparaison
    bool operator==(const Complex& other) const {
        return real == other.real && imag == other.imag;
    }

    // Operateurs de flux (comme fonctions amies)
    friend std::ostream& operator<<(std::ostream& os, const Complex& c) {
        os << c.real << " + " << c.imag << "i";
        return os;
    }

    friend std::istream& operator>>(std::istream& is, Complex& c) {
        is >> c.real >> c.imag;
        return is;
    }
};

6. Templates

Programmation generique pour la reutilisabilite du code :

// Template de fonction
template<typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

// Template de classe
template<typename T>
class Stack {
private:
    std::vector<T> elements;

public:
    void push(const T& element) {
        elements.push_back(element);
    }

    T pop() {
        if (elements.empty()) {
            throw std::runtime_error("Stack is empty");
        }
        T value = elements.back();
        elements.pop_back();
        return value;
    }

    bool empty() const {
        return elements.empty();
    }

    size_t size() const {
        return elements.size();
    }
};

// Specialisation de template
template<>
class Stack<bool> {
    // Implementation specialisee pour bool
};

7. Bibliotheque standard de templates (STL)

Collection puissante de conteneurs et algorithmes generiques :

Conteneurs :

// Conteneurs sequentiels
std::vector<int> vec = {1, 2, 3, 4, 5};
std::list<std::string> lst;
std::deque<double> deq;

// Conteneurs associatifs
std::map<std::string, int> ages;
ages["Alice"] = 25;
ages["Bob"] = 30;

std::set<int> unique_numbers = {1, 2, 3, 3, 4};  // {1, 2, 3, 4}

// Adaptateurs de conteneurs
std::stack<int> stack;
std::queue<int> queue;
std::priority_queue<int> pq;

Algorithmes :

#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// Tri
std::sort(numbers.begin(), numbers.end());

// Recherche
auto it = std::find(numbers.begin(), numbers.end(), 8);

// Transformation
std::transform(numbers.begin(), numbers.end(), numbers.begin(),
               [](int n) { return n * 2; });

// Accumulation
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);

8. Pointeurs intelligents (C++11)

Gestion automatique de la memoire :

#include <memory>

// Pointeur unique (propriete exclusive)
std::unique_ptr<int> ptr1 = std::make_unique<int>(42);

// Pointeur partage (propriete partagee)
std::shared_ptr<int> ptr2 = std::make_shared<int>(100);
std::shared_ptr<int> ptr3 = ptr2;  // Compteur de references = 2

// Pointeur faible (reference non proprietaire)
std::weak_ptr<int> weak = ptr2;

// Exemple avec des classes
class MyClass {
public:
    MyClass() { std::cout << "Constructeur\n"; }
    ~MyClass() { std::cout << "Destructeur\n"; }
    void doSomething() { std::cout << "Fait quelque chose\n"; }
};

std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();
obj->doSomething();
// Destructeur appele automatiquement quand obj sort de la portee

9. Gestion des exceptions

Gestion robuste des erreurs :

class FileNotFoundException : public std::exception {
private:
    std::string message;

public:
    FileNotFoundException(const std::string& filename)
        : message("Fichier non trouve : " + filename) {}

    const char* what() const noexcept override {
        return message.c_str();
    }
};

void readFile(const std::string& filename) {
    try {
        std::ifstream file(filename);
        if (!file.is_open()) {
            throw FileNotFoundException(filename);
        }
        // Lire le fichier...
    } catch (const FileNotFoundException& e) {
        std::cerr << "Erreur : " << e.what() << std::endl;
        throw;  // Re-lancer
    } catch (const std::exception& e) {
        std::cerr << "Erreur inattendue : " << e.what() << std::endl;
    }
}

10. Patrons de conception

Solutions de conception logicielle courantes :

Patron Singleton :

class Database {
private:
    static Database* instance;
    Database() {}  // Constructeur prive

public:
    static Database* getInstance() {
        if (instance == nullptr) {
            instance = new Database();
        }
        return instance;
    }

    void connect() {
        std::cout << "Connexion a la base de donnees...\n";
    }
};

Patron Fabrique :

class ShapeFactory {
public:
    static std::unique_ptr<Shape> createShape(const std::string& type) {
        if (type == "circle") {
            return std::make_unique<Circle>("red", 5.0);
        } else if (type == "rectangle") {
            return std::make_unique<Rectangle>("blue", 4.0, 6.0);
        }
        return nullptr;
    }
};

PARTIE D : PARTIE ANALYTIQUE

Connaissances et competences mobilisees

  • Comprehension des principes de la programmation orientee objet
  • Implementation de classes avec une encapsulation correcte
  • Utilisation efficace de l'heritage et du polymorphisme
  • Gestion de la memoire avec RAII et les pointeurs intelligents
  • Application des templates pour la programmation generique
  • Utilisation des conteneurs et algorithmes de la STL
  • Gestion correcte des exceptions
  • Implementation de patrons de conception
  • Debogage de programmes C++ complexes

Auto-evaluation

Ce cours etait exigeant mais enrichissant. Venant de la programmation en C, le passage a la pensee orientee objet a necessite un ajustement mental significatif. Le concept de classes et d'objets etait initialement abstrait, mais a travers des projets pratiques, j'ai acquis une comprehension solide.

La gestion de la memoire en C++ (notamment avec les pointeurs et l'allocation dynamique) etait delicate. Cependant, l'apprentissage du RAII et des pointeurs intelligents a rendu la gestion memoire beaucoup plus facile et sure. L'introduction des fonctionnalites C++11 comme la semantique de deplacement et les fonctions lambda etait particulierement interessante.

Les templates et la STL semblaient initialement ecrasants en raison de leur complexite, mais j'ai fini par apprecier leur puissance pour ecrire du code generique et reutilisable. Les messages d'erreur lies a la compilation des templates etaient souvent cryptiques et difficiles a deboguer.

J'ai trouve le polymorphisme et les fonctions virtuelles fascinants, notamment la maniere dont ils permettent une conception logicielle flexible et extensible. L'implementation de patrons de conception m'a aide a comprendre l'architecture logicielle professionnelle.

Mon avis

Le C++ est un langage puissant mais complexe. Ce cours a fourni une base solide en POO avec C++, bien que la maitrise du langage necessite une pratique continue. Le cours equilibrait bien la theorie et l'implementation pratique.

J'ai particulierement apprecie l'apprentissage des fonctionnalites modernes du C++ (C++11/14/17). Ces fonctionnalites rendent le C++ plus convivial tout en maintenant ses avantages en termes de performance. Comprendre la relation entre le C et le C++ m'a aide a apprecier quand utiliser les fonctionnalites du C++ par rapport a la programmation en style C.

Domaines que j'aurais aime explorer davantage :

  • Multithreading et concurrence en C++
  • Metaprogrammation par templates
  • Patrons de conception plus complexes
  • Techniques d'optimisation de performance
  • Systemes de build et organisation de projets

Les projets ont aide a solidifier les concepts, bien que davantage d'applications du monde reel (comme la programmation de systemes embarques ou le developpement de jeux) auraient ete precieuses. Dans l'ensemble, ce cours m'a equipe de competences essentielles pour le developpement logiciel moderne.


Illustrations du Projet Gamelle Connectee

Diagramme de classes du projet Gamelle Connectee

Figure : Diagramme de classes UML du projet Gamelle Connectee

Interface de la Gamelle Connectee

Figure : Application Gamelle Connectee - interface client

Architecture serveur du projet Gamelle Connectee

Figure : Architecture serveur du projet Gamelle Connectee


Rapports et Projets

Rapport Gamelle Connectee

Rapport du projet de programmation orientee objets C++ : conception et implementation d'une gamelle connectee avec architecture client-serveur.

Telecharger le rapport PDF


Documents de Cours

Partie 1 - Bases C++

Introduction au C++ : differences avec C, compilation, entrees/sorties, references et gestion memoire.

Telecharger

Partie 2 - Classes

Classes en C++ : constructeurs, destructeurs, encapsulation, membres prives/publics et methodes.

Telecharger

Partie 3 - Heritage

Heritage en C++ : classes derivees, constructeurs/destructeurs en cascade, acces protected.

Telecharger

Partie 4 - Polymorphisme

Polymorphisme en C++ : fonctions virtuelles, classes abstraites, liaison dynamique et virtual.

Telecharger