Introduction au C++

Dans cette première partie, nous allons voir une introduction rapide au langage C++ lui même, indépendamment de la partie graphique qui sera introduite dans la partie suivante. Ces notions de langage sont donc très génériques, mais il est important de les comprendre pour pouvoir les utiliser dans les programmes plus complexes de la suite.

Premier programme

> Téléchargez l'archive suivante et décompressez la: 01_hello_world.zip
Le fichier main.cpp contient le code suivant:
#include <iostream>
int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}
Pour exécuter le programme correspondant à ce code, deux étapes sont nécessaires
Ces deux étapes dépendent de votre système. Pour cela, vous pouvez vous référer à la démarche indiqué préalablement pour la mise en place de votre système.

Si vous êtes sous Windows

Si vous êtes sous Linux ou MacOS


# Lister les fichiers du repertoire courant
ls 

# Se déplacer dans le répertoire "directory"
cd directory 

# Se déplacer dans le répertoire parent
cd .. 

# Lancer un fichier exécutable (ex. pgm) dans le répertoire courant
./pgm

# Lancer un fichier exécutable (pgm) contenu dans le répertoire directory depuis le répertoire parent
directory/pgm

Analyse du code

Si tout se passe correctement, et ce indépendamment de votre système, l'exécution du programme doit aboutir à l'affichage du message "Hello world" en ligne de commande.

Voici l'explication de chaque ligne de ce code:





Remarques générales:

C++ moderne

Le langage C++ possède une longue histoire depuis sa création initiale en 1985. Le langage fut initialement conçu comme une extension du langage C avec l'introduction de l'orienté objet. Il reste encore aujourd'hui compatible avec le langage C, mais peut être utilisé suivant de multiples approches.

La bonne utilisation de la syntaxe C++ moderne permet d'aboutir à des codes plus simples et lisibles, tout en gardant une efficacité optimale d'exécution. Dans ces TD, nous utiliserons une syntaxe compatible avec la norme C++14.

Modifiez votre fichier main.cpp de manière à ce qu'il contienne le code suivant:
#include <iostream>
#include <string>
#include <vector>


int main()
{
    std::string str = "Hello ";
    auto str2 = str + "World";
    
    std::cout << str2 << std::endl;


    std::vector<int> vec = {4,1,3,5};
    vec[0] -= 2;
    vec.push_back(10);
    for(auto x : vec)
        std::cout << x << " ";
        
    std::cout<<std::endl;
    return 0;
}

La compilation et l'exécution de ce programme se réalisent à l'aide des lignes de commande suivante:

Remarques sur la compilation (Linux et MacOS uniquement)

Ces notions ne sont utiles que pour les étudiants qui compilent sous Linux ou MacOS directement en ligne de commande
g++ -g -Wall -Wextra -O2 -std=c++14 [fichier].cpp -o pgm
./pgm

Remarques sur le code

Remarques générales sur le C++

Pourquoi apprendre C++

C++ est actuellement le langage de programmation dominant pour les logiciels scientifiques interactifs de large envergure. Que ce soit pour des applications en 3D et en graphique: Maya, 3DStudio, ZBrush, Houdini, Photoshop, Unreal Engine, etc., mais également dans de nombreux autres domaines: MS Word, Facebook, Tensor Flow, etc. possèdent tout un coeur (partie du programme réalisant les taches les plus critiques de calculs) codé en C++.

Notez que la plupart de ces logiciels possèdent des interfaces avec des langages de scripts de plus haut niveau afin de pouvoir être utilisés plus efficacement pour réaliser de petits prototypes (ex. Python, Lua, C#, etc.). Cependant ces scripts font appel aux fonctionnalités au coeur du logiciel qui sont codées pour leur part en C++. Ne négligez donc pas l'apprentissage du C++ si vous souhaitez être en mesure de pouvoir comprendre le fonctionnement de ces logiciels de manière approfondie.

Principes du C++

Principe généraux et comparaisons à d'autres langages

Le langage C++ est dit multi-paradigm. C’est-à-dire qu’il peut être utilisé dans une vaste gamme d’application, et suivant plusieurs approches (procédural, objet, fonctionnel, meta-programmation, etc.). C'est à l'heure actuelle l'un des seuls langages ayant un écosystème stable et complet permettant, d'un côté, de développer à très bas niveau en étant très proche du système d'exploitation/matériel (et donc très efficace), et d'un autre côté de proposer des abstractions de plus haut niveau quasiment sans aucun surcout en temps de calcul.

A titre de comparaison:

Le pendant de la richesse du langage C++ est cependant sa complexité. Il n’existe ainsi pas une unique manière de coder en C++ (utilisation de pointeurs à la C, pur objet, fonctionnel, etc); chaque approche pouvant se prêter plus ou moins à un type d’application ou d’habitude. Le C++ est un langage très technique difficile à lire et à écrire de par la précision et la rigueur nécessaire à l'écriture du code associé (type de variable, positionnement en mémoire, template, etc.).

Dans le cas présent, nous utiliserons principalement une programmation procédurale, où les objets seront généralement de petites structures allouées statiquement afin de pouvoir être créées et manipulées de manière légère (en mémoire) et rapide (en temps de calcul). Nous utiliserons les surcharges d'opérateurs pour modéliser et manipuler aisément des objets mathématiques (vecteurs, matrices). Nous utiliserons également largement les conteneurs de la librairie standard permettant de gérer des objets dynamiques sans avoir à manipuler explicitement les allocations mémoires.
A l'opposé, nous n'aborderons dans ce cours pas (ou que très marginalement) la gestion manuelle de la mémoire, l'utilisation de pointeurs, le polymorphisme, les templates.

Notion de langage compilé

C++ est un langage dit "compilé". C'est-à-dire que le code C++ est converti en code assembleur qui peut être directement exécuté par le processeur central (CPU). La compilation peut être une opération longue. Par contre, une fois celui-ci compilé, l'exécution est généralement beaucoup plus rapide que l'exécution d'un langage interprété.

C++ est un langage dit "typé statiquement" (à l'opposé des langages de scripts dits "dynamiques"). Toute variable doit avoir un type fixe connu au moment de la compilation, et ce type ne peut pas varier au cours de la durée de vie de la variable.
Le typage des variables implique d'être rigoureux lors de l'écriture du code. Cette plus grande rigueur permet cependant au compilateur d'être plus précis pour détecter les erreurs (avant même l'exécution du programme) et vérifier la cohérence du code (ex. passage de données ayant un type cohérent d'une fonction à l'autre, etc.). Le typage statique est souvent indispensable pour le développement de logiciels de grande envergure (100aines-milliers - millions de lignes de codes).

Références

Pour approfondir vos connaissances en C++, il vous est possible de vous référer au cours INF442 qui aborde davantage de détails sur le langage, ainsi qu'au livre "The C++ Programming Language" de Bjarne Stroustrup (créateur du langage C++).

De manière générale, n'hésitez pas à rechercher des informations sur la référence en ligne du langage ainsi que de sa bibliothèque standard : CPP Reference.