391-Intro-C PDF
391-Intro-C PDF
391-Intro-C PDF
Éric Beaudry
2013E
Sommaire
1 Introduction
3 Fonctions
4 Entrées et sorties
5 Mémoire
6 Classes
7 Const
8 Opérateurs
Historique
Origine du C++
Extension orienté objet du langage C.
« ++ » signifit un incrément par rapport à C.
Développé par Bjarne Stroustrup au Bell labs d’AT&T dans les
années 1980.
Standardisation / Normalisation
Normalisé par ISO (Organisation mondiale de normalisation)
depuis 1998.
Influence
Le C++ est très utilisé en industrie et en recherche (efficacité).
Le C++ a influencé d’autres langages comme Java et C#.
Éric Beaudry (UQAM) INF3105 / Intro C++ 2013E 4 / 67
Introduction Les fondements du langage C++ Fonctions E/S Mémoire Classes Const Opérateurs
Caractéristiques et paradigmes
Multiplateforme.
Langage de haut niveau (mais plus bas que Java).
Compilé en langage machine.
Impératif.
Fortement typé.
Orienté objet.
Procédural.
Générique.
bienvenue.cc
#include <iostream>
Fichiers sources
Déclaration vs Définition
Déclaration
La compilation se fait en une seule passe (excluant l’édition des
liens).
Tout doit être déclaré avant d’être utilisé.
Une déclaration ne fait que déclarer l’existence de quelque chose
lié à un identificateur (symbole). Exemples : variables, fonctions,
classes, etc.
Définition
La définition est le code des functions, constructeurs, etc.
Après la compilation, il y a une passe d’édition des liens (linker).
Tout symbole utilisé doit être défini à l’édition des liens.
helloworld.cc
#include <iostream>
int main(int argc, char∗∗ argv)
{
allo(); // Error: symbol allo undefined!
return 0;
}
// Declaration et definition d’une fonction allo()
void allo(){
std::cout << "Hello World!" << std::endl;
}
helloworld.cc
#include <iostream>
// Declaration et definition d’une fonction allo()
void allo(){
std::cout << "Hello World!" << std::endl;
}
int main(int argc, char∗∗ argv)
{
allo();
return 0;
}
helloworld.cc
#include <iostream>
// Declaration de la fonction allo()
void allo();
int main(int argc, char∗∗ argv)
{
allo();
return 0;
}
// Definition de la fonction allo()
void allo(){
std::cout << "Hello World!" << std::endl;
}
Éric Beaudry (UQAM) INF3105 / Intro C++ 2013E 11 / 67
Introduction Les fondements du langage C++ Fonctions E/S Mémoire Classes Const Opérateurs
void allo();
allo.cc
#include <iostream>
void allo(){
std::cout << "Hello World!" << std::endl;
}
helloworld.cc
#include "allo.h"
void main(int argc, char∗∗ argv) {
allo();
} Éric Beaudry (UQAM) INF3105 / Intro C++ 2013E 12 / 67
Introduction Les fondements du langage C++ Fonctions E/S Mémoire Classes Const Opérateurs
Organisation et compilation
Sources
Librairies
Fichiers
entêtes
Fichiers Fichiers
(.h, .hpp)
sources entêtes
(.c, .cc, .cpp) (.h, .hpp)
Librairies
Librairies
dynamiques
statiques
(.so / .dll)
(.a / .lib)
Chargeur
Fichiers (exécution)
Préprocesseur
intermédiaires
Fichiers Fichier
Éditeur
objets exécutable
de liens
(.o / .obj) ( / .exe)
Compilateur
C++
Types
Structures
Types
Type (mot clé) Description Taille (octets) Capacité
bool Booléen 1 {false, true}
char Entier / caractère ASCII 1 {−128, . . . , 127}
unsigned char Entier / caractère ASCII 1 {0, . . . , 255}
unsigned short Entier naturel 2 {0, . . . , 21 6 − 1}
unsigned short int
short Entier 2 {−215 , . . . , 215 − 1}
short int
unsigned int Entier naturel 4 {0, . . . , 232 − 1}
int Entier 4 {−231 , . . . , 231 − 1}
unsigned long Entier naturel 8 {0, . . . , 264 − 1}
long Entier 8 {−263 , . . . , 263 − 1}
float Nombre réel 4 ±3.4 × 10±38 ( 7 chiffres)
double Nombre réel 8 ±1.7 × 10±308 ( 15 chiffres)
long double Nombre réel 8 ±1.7 × 10±308 ( 15 chiffres)
Déclaration variables
Une variable est une instance d’un type de données. En C++, les
variables sont considérées comme des objets. Chaque variable est
nommée à l’aide d’un identificateur. L’identificateur doit être unique
dans sa portée.
Exemple
Énoncés et expressions
Énoncés / Affectation
Affectation
// Declaration
int a;
// Affectation
a = 2 + 10;
Expressions
Exemples d’expressions
4+5∗6−8;
(4+5)∗(6−8);
a ∗ 2 + 10;
a = b = c = d;
// est l’equivalent de :
c = d; b = c; a = b;
Exemples d’expressions
a++; // a = a + 1;
a+=10; // a = a + 10;
a∗=2; // a = a ∗ 2;
a/=2; // a = a / 2;
Instructions de contrôle
Tableaux
Pointeurs et références
Pointeurs
int n = 3;
int∗ ptr_n = &n;
int∗ tableau = new int[100];
Déférencement de pointeurs
int n=0;
int ∗pointeur = &n;
∗pointeur = 5; // effet : n=5
std::cout << "n=" << ∗pointeur << std::endl;
Code 1 (lisibilité)
int tableau[1000];
int somme = 0;
for(int i=0;i<1000;i++)
somme += tableau[i];
Code 2 (efficacité*)
int tableau[1000];
int somme = 0;
int∗ fin = tableau+1000; // pointe sur l’element suivant le dernier element
for(int∗ i=tableau;i<fin;i++)
somme += ∗i;
Références
int n = 2;
int& ref_n = n;
n = 3;
std::cout << "ref_n=" << ref_n << std::endl;
Fonctions
Similaire à Java et C.
Passage de paramètres
Exemple
demo01.cc
#include <iostream>
using namespace std;
demo02.cc
#include <fstream>
void main(int argc, char∗∗ argv){
int a, b;
std::ifstream in("nombres.txt");
cout << "Lire deux nombres:" << endl;
in >> a >> b;
int somme = a + b;
std::ostream out("somme.txt");
out << somme << endl;
}
... ...
Tas (heap) Pile d'exécution
Allocation mémoire
Espace mémoire
main()
x y
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 03 00 05
f2() main()
c a x y
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 03 ?? ?? ?? ?? 00 03 00 05
e d c a x y
?? ?? ?? ?? ?? ?? 00 04 ?? ?? ?? ?? ?? ?? 00 03 ?? ?? ?? ?? 00 03 00 05
f2() main()
c a x y
?? ?? ?? ?? ?? ?? 00 04 ?? ?? ?? ?? 00 07 00 05 ?? ?? ?? ?? 00 03 00 05
main()
x y
?? ?? ?? ?? ?? ?? 00 04 ?? ?? ?? ?? 00 07 00 05 ?? ?? ?? ?? 00 03 00 07
f1() main()
Éric Beaudry (UQAM) INF3105 / Intro C++ 2013E 40 / 67
Introduction Les fondements du langage C++ Fonctions E/S Mémoire Classes Const Opérateurs
struct A{
short int v1, v2;
};
void main(){
char c = 0;
short int ∗tab = new short int[6] {0x00, 0x01, 0xc712, 0x03, 0x14, 0x3b05};
A a1; a1.v1=0x00b5; a1.v2=0x0073;
A∗ a2 = new A();
a2−>v1=0; a2−>v2=2;
A∗ a3 = new A[3];
a3[1].v1=0x7fff; a3[1].v2=0x0020;
// Sur la diapo suivante : etat de la memoire jusqu’ici
delete[] tab; delete a2; delete[] a3;
}
Allocation mémoire
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x0_ ?? ?? 00 00 00 01 c7 12 00 03 00 14 3b 05 00 00
0x1_ 00 02 ?? ?? ?? ?? 7f ff 00 20 ?? ?? ?? ?? ?? ?? Tas
0x2_ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
0x3_ ?? ?? ?? ?? ?? ?? ?? ?? 00 02 00 b5 00 73 0E 12 }Pile
c tab a1.v1 a1.v2 a2 a3
a1
c 0 00 01 c712 03 14 3b05
tab
.v1 00b5 0
a1 2
.v2 0173
a2 ? 7fff ?
a3 ? 20 ?
Classes en C++
Similaire à Java
En fait Java est inspiré (et simplifié !) de C++.
Constructeurs.
Constructeur par défaut.
Constructeur par copie.
Destructeurs.
Surcharge d’opérateurs (+, -, +=, -=, =, ==, <, (), etc.).
Classe Point
class Point {
public:
double distance(const Point& p) const;
private:
double x, y;
};
Constructeurs
Destructeurs
Déclaration
class Point {
public:
Point(); // constructeur sans argument
Point(double x, double y);
...
};
Définition
Point::Point(){
x = y = 0.0;
}
Point::Point(double x_, double y_)
: x(x_), y(y_) // le deux−points (":") est pour l’initialisation
{
} Éric Beaudry (UQAM) INF3105 / Intro C++ 2013E 48 / 67
Introduction Les fondements du langage C++ Fonctions E/S Mémoire Classes Const Opérateurs
class Tableau10int{
public:
Tableau10int();
~Tableau10int();
private:
int∗ elements;
};
Constructeur et Destructeur
Tableau10int::Tableau10int() {
elements = new int[10];
}
Tableau10int::~Tableau10int() {
delete [] elements ;
}
class A{
public:
int f(int v=0);
private:
int a;
};
int A::f(int v){
int t = this−>a; // t=a
this−>a = v; // a=v
return a;
}
Contexte
Exemple
Exemple
Exemple
Opérateurs
Surcharge d’opérateurs
class Vecteur {
public:
Vecteur(double vx_=0, double vy_=0):vx(vx_),vy(vy_){}
Vecteur& operator += (const Vecteur& v);
Vecteur operator + (const Vecteur& v) const;
private:
double vx, vy;
};
Surcharge d’opérateurs
vecteur.cpp
#include "vecteur.h"
Vecteur& Vecteur::operator += (const Vecteur& autre) {
vx−=autre.vx; vy−=autre.vy;
return ∗this;
}
Vecteur Vecteur::operator + (const Vecteur& autre) const{
return Vecteur(vx+autre.vx, vy+autre.vy);
}
point.h
class Point{
private:
double x, y;
friend std::istream& operator >> (std::istream& is, Point& p);
friend std::ostream& operator << (std::ostream& os, const Point& p);
};
point.cpp
Exercice d’abstraction
class Immeuble {
public:
private:
string nom;
Point position;
double hauteur;
int nbclients;
Mauvaise approche...
Bonne approche...