Exam 1 (module 2) Flashcards
État d’un objet
Valeurs de ses attributs ou
de l’information qu’il
contient.
Comportement d’un objet
Ensemble des opérations
que l’on peut effectuer sur
celui-ci.
Identité d’un objet
Deux objets peuvent être exactement dans le même état,
mais sont différents de part leur identité unique (adresse en mémoire)
Objet (définition)
Entité discrète qui existe dans le temps et dans l’espace.
Classe (définition)
-Abstraction qui n’existe que dans les programmes
-Représente un ensemble d’objets qui partagent une structure commune et un comportement commun
Qu’est-ce qu’une classe définit
Les opérations permises sur les objets de la classe et les états qu’ils peuvent prendre
2 synonymes d’objet
instance et occurrence
Qu’est-ce que l’interface d’une classe?
Elle contient principalement les déclarations de toutes les
opérations applicables sur les instances de cette classe et elle définit ce qui est vu de l’extérieur
L’interface d’une classe est dans quel fichier?
Le .h
Qu’est-ce que l’implémentation d’une classe?
Ce qui est caché à l’intérieur de la classe (le code qui réalise les opérations qui sont définies dans l’interface).
L’implémentation d’une classe est dans quel fichier?
le .cpp
(publique ou privé?) Les méthodes sont xxx et les membres sont xxx.
méthodes = publiques, membres/attributs = privés
Pourquoi mettre quelque chose dans la partie privée de la classe?
Pour pas que l’utilisateur puisse le changer et faire des erreurs
Rôle d’une classe
Assurer la validité de tous les objets créés à partir d’elle
Quand est-ce qu’un objet doit être valide?
De sa création à sa destruction
À quoi sert l’encapsulation
Ne pas permettre l’accès direct aux attributs d’un objet (il faut passer par un accesseur et un mutateur)
Problèmes possibles si les attributs ne sont pas contrôlés
➢Possibilité de non-initialisation.
➢Possibilité de mauvaise assignation.
(Pas de garantie sur la validité des données)
La visibilité d’une classe est XXXX par défaut
privée! (la norme est de la spécifier explicitement)
(Vrai ou faux) On peut accéder directement à des attributs privés
faux
Norme du cours sur le nom d’un membre/attribut
m_blablabla
Pour utiliser une classe qu’on a fait il faut inclure quoi dans le main?
include Classe.h
Rôle des méthodes
Contrôler l’assignation des valeurs sur les champs
C’est quoi “this”
Un pointeur vers l’objet courant
Quand on crée un objet, qu’est-ce qui doit être initialisée pour qu’il soit cohérent?
ses attributs (à l’aide du constructeur)
Caractéristiques d’un constructeur
-Méthode spéciale qui a le même nom que la classe
-Est automatiquement appelé à la création d’un objet de cette classe
-N’a pas de type de retour
-Ne retourne pas de valeur
Pourquoi on ne peut pas créer un objet et l’initialiser après
Parce qu’il y a un lapse de temps où il n’est pas valide
(Vrai ou faux) Il est impossible d’avoir plusieurs constructeurs dans une même classe.
Faux! Ça se peut
C’est quoi la surcharge de méthode et comment ça marche?
C’est faire plusieurs méthodes du même nom. Lorsqu’une fonction surchargée est appelée, le compilateur sélectionne la bonne fonction selon les arguments (nombre, type, ordre…)
Si on veut une classe date qui accepte les paramètres jour, mois et année, mais qui fonctionne aussi sans paramètre. Quel est le code dans le .h?
class Date
{
public:
Date(); //constructeur par défaut
Date(int p_jour, int p_mois, int p_annee);
…
}; //ya un ; à la fin quand .h!
Comment initialiser les membres d’une classe dans le constructeur?
Avec une liste d’initialisation :
Date::Date(int p_jour, int p_mois, int p_annee)
: m_jour(p_jour), m_mois(p_mois), m_annee(p_annee)
{
//ne pas les mettre ici avec des =
}
La commande suivante sert à quoi?
Date()= delete;
Déclarer explicitement qu’on veut pas de compilateur par défaut
Qu’est-ce qu’un destructeur?
-Une méthode particulière de la classe qui porte le même nom que la classe, mais est précédé par un tilde ~
-Est exactement le complément du constructeur
(Vrai ou faux) Le destructeur détruit l’objet
Faux! Il fait le ménage à l’intérieur avant la destruction.
Est-ce que le destructeur reçoit un paramètre? Est-ce qu’il retourne une valeur?
Non et non! Pas de paramètre et retourne rien
(Vrai ou faux) Il peut y avoir plusieurs destructeurs par classe.
Faux! UN SEUL destructeur par classe
int main()
{
{
Date uneDate(1, 1, 1965);
}
return 0;
}
Où est la fin de la portée du destructeur?
int main()
{
{
Date uneDate(1, 1, 1965);
} //ici
return 0;
}
Est-ce que c’est pertinent d’implanter un destructeur même si il a rien à faire?
Ex:
Date::~Date()
{
}
Non
Norme du cours pour nommer une méthode d’accès? Et d’assignation?
Accès : reqDequoi
Assignation : asgDequoi
class Date
{
public:
int reqJour () XXXX;
…
};
Qu’est-ce qu’il manque à l’initialisation la méthode d’accès?
const!! Une méthode d’accès est une méthode constante (on ne veut rien modifier on veut juste accéder à l’info (lecture))!
class Date
{
public:
XXXX asgJour (int p_jour);
…
private:
…
};
Qu’est-ce qu’il manque à la méthode d’assignation?
void (pcq retourne rien, fait juste utiliser le paramètre qui lui est donné)
Méthode de comparaison
-Pour comparer deux objets du même type
-retourne un booléen
Pour que deux objets soient égaux, il faut que …
Tous les couples de paramètres soient égaux (valeurs des attributs)
bool Date::estEgal(const Date& p_date) const
{
return m_jour == XXXX &&
m_mois == YYYY &&
m_annee == ZZZZ;
}
XXXX = p_date.m_jour
YYYY = p_date.m_mois
ZZZZ = p_date.m_annee
int main()
{
Date date1(4,9,2002);
Date date2;
if (date2.estEgal(date1))
…
}
Quel est l’objet implant/courant et quel est l’objet paramètre?
implant = date1
paramètre = date2
inverse???
Méthodes utilitaires
- à l’intérieur de la classe sans pour autant vouloir
en faire un service publique. - sont appelées par les autres méthodes de la
classe.
class Date
{
public:
…
std::string reqDateFormatee()
const;
…
private:
std::string reqNomMois() const;
};
Pourquoi méthode reqNomMois dans private?
Parce qu’elle est juste appelée dans reqDateFormatee (on en a pas besoin ailleurs, c’est une méthode utilitaire)
std::string Date::reqNomMois () const
{
static string NomMois[] = {“janvier”, “février”, “mars”, “avril”,
“mai”, “juin”, “juillet”, “août”,
“septembre”, “octobre”,”novembre”, “décembre”};
return NomMois[reqMois()-1];
}
Pourquoi -1?
Parce que reqMois donne le numéro du mois (ex : janvier =1), mais l’index de la string commence à 0.
Méthodes statiques
-Méthode de classe ne nécessitant pas la présence d’un objet pour le traitement
-Comme une fonction mais associée à la classe
-Ne touche pas aux attributs de la classe, à moins que ceux-ci ne soient aussi statiques (attribut commun à tous les objets de la classe)
Est-ce qu’il faut mettre const pour une méthode statique?
non (exemple p.79)
bool Date::estBissextile(int p_annee)
{
????
}
return (((p_annee % 4 == 0) && (p_annee % 100 != 0)) ||
((p_annee % 4 == 0) && (p_annee % 100 == 0) &&
(p_annee % 400 == 0)) );
(Vrai ou faux) Une méthode statique a besoin d’un objet du type de la classe pour être appelée.
Faux, elle n’en a pas besoin
(Norme) Toujours appeler les méthodes statiques avec la XXXX de la classe
portée (classe::méthodeStatique)
exemple : Date::estBissextile(2000)
Quand on initialise un attribut statique il faut …
mettre la classe devant
exemple : int Etudiant::m_nbInstances=0;
int main()
{
{
Etudiant et1, et2, et3;
cout «_space;“Résultat :” «_space;endl;
cout «_space;Etudiant::reqNbInstances() «_space;endl;
Etudiant et4, et5;
cout «_space;Etudiant::reqNbInstances() «_space;endl;
}
cout «_space;Etudiant::reqNbInstances() «_space;endl;
return 0;
}
Qu’est-ce qui est écrit dans la console quand on compile?
Résultat:
3
5
0 (voir p.84)
Namespace
- regroupement logique de fonctions, de classes, etc.
- Possibilité de lui donner un nom.
- NomDuNamespace::NomDeLEntite
Ça sert à quoi un namespace
Qu’il n’y ait pas d’ambiguité quand deux fonctions ont le même prototype (chacune un namespace différent comme ça on sait laquelle prendre)
Comment assigner un namespace à une fonction qu’on crée?
exemple : //c’est le .h
namespace util{
int fonction();
}
Pourquoi ne pas utiliser plusieurs using namespace en même temps (qui contiennet des fonctions pareilles)?
Parce que ça ramène l’ambiguité (on sait pas quel choisir)
(Vrai ou faux) Il ne faut JAMAIS utiliser de using namespace dans un .h
Vrai! ça polluerait les fichiers
Comment faire pour qu’un using namespace soit local?
Mettre des {} autour
(Vrai ou faux) On peut rajouter quelque chose dans un namespace
déjà défini.
Vrai
Qu’est-ce que le polymorphisme?
La surcharge de méthodes (créer plusieurs méthodes du même nom dans la classe pourvu qu’elles varient au niveau des paramètres)
Comment le compilateur sélectionne-t-il la bonne méthode quand une méthode surchargée est appelée?
Il regarde les paramètres (le nombre, le type et l’ordre)
La surcharge doit être utilisée pour implanter des traitements XXXX.
similaires
(Vrai ou faux) Le type de retour est pris en compte par le compilateur lors qu’il différencie les méthodes surchargées
Faux! Le type de retour n’est pas pris en compte fec si le reste est pareil il pense que c’est la même
Comment mettre un paramètre par défaut à notre fonction?
Le mettre = à quelquechose direct dans son prototype.
exemple :
void imprimer (int valeur, int base = 10);
les deux lignes suivantes sont la mêmê chose :
imprimer (31);
imprimer (31, 10);
Les paramètres par défaut sont vérifiés à XXXX et évalués à YYYY.
XXXX = la compilation
YYYY = l’exécution
(Vrai ou faux) On peut mettre un paramètre par défaut à n’importe quelle position (1er argument, 2e, etc) dans le prototype.
Faux! Il doit être à la fin!! (Si plusieurs, ils doivent tous être en dernier)
class A
{
public:
A();
A(int v1=0, int v2=0);
private:
int m_v1;
int m_v2;
};
Qu’est-ce qui marche pas?
Il y aura conflit entre A() et A(int v1=0, int v2=0)
Surcharge des opérateurs
-Consiste à redéfinir des opérateurs usuels comme +, -, *, /, =, <,
[], etc… sur de nouveaux types : les classes
-Peut rendre la lecture du code plus facile
Opérateurs qui ne peuvent PAS être surchargés
. .* :: ?: (liste de ceux qui peuvent p.108)
(Vrai ou faux) On ne peut pas créer de nouveaux opérateurs
Vrai (|x|, y:=x, x**2 tous invalides)
Ce qui est important de faire quand on surcharge un opérateur
Respecter les règles de préséance et d’associativité et éviter la confusion (faire des trucs qui fittent avec l’opérateur)
Comment définir l’opérateur == sur des objets dates?
.h :
public:
bool operator== (const Date& p_date) const;
.cpp :
bool Date::operator==(const Date& p_date) const
{
return m_temps == p_date.m_temps;
}
date1 == date2 ça revient à quoi?
date1.operator==(date2)
Est-ce que v++ et ++v c’est pareil?
non
Comment définir «_space;sur un objet date?
std::ostream& operator«(std::ostream& p_os, const Date& p_date)
{
p_os «_space;p_date.m_temps;
return p_os;
}
*faut que ça retourne un ostream pour pouvoir mettre un autre «_space;après (si on veut cout dequoi d’autre)
Quand utiliser le passage par valeur?
-Quand on ne veut pas modifier la valeur des données originales
-JUSTE sur types de base (int, float, char, double, bool) ou sur variables locales pcq sinon le coût de la copie est élevé
Quand utiliser le passage par pointeurs?
-Pour éviter le coût de la copie
-Quand on veut que les données originales soient modifiées (accès direct)
*utilisé dans de rares cas (polymorphisme)
Comment faire un passage par de chaque sorte (valeur, pointeur, référence, référence constante)?
string MettreEnMajuscule (XXXX)
{
…
}
string NOM = MettreEnMajuscule(YYYY)
valeur : XXXX=string p_texte & YYYY=nom
pointeur : XXXX=string* p_texte & YYYY=&nom
référence : XXXX=string& p_texte & YYYY=nom
référence constante : XXXX=const string& p_texte & YYYY=nom
Quand utiliser le passage par référence?
-Pour éviter le coût de la copie
-Quand on veut que les données originales soient modifiées (accès direct)
-On prend plus lui que pointeur
Quand utiliser le passage par référence constante?
-Pour éviter le coût de la copie
-Pour ne PAS modifier les données originales (les protège)
-Pareil que par copie/valeur, sans le coût
Différence entre les 3 :
1) Mot& reqAdresse() const;
2) const Mot& reqAdresse() const;
3) Mot reqAdresse() const;
1) par référence (risque de retourner une variable locale et non respect de l’encapsulation) À NE PAS FAIRE
2) par référence constante
3) par valeur (pour retourner une variable locale)