UNIVERSITE DE LA MANOUBA
-----¤¤¤¤-----
ECOLE NATIONALE DES SCIENCES
DE L'INFORMATIQUE
ANNEE UNIVERSITAIRE
2016-2017
Matière : Programmation Orientée Objet
Niveau : II1
Enseignants : K. BEN RHOUMA, W. CHAKER, I. FLISS, R. CHEBIL, F. BEN HMIDA, I. BOUKHRIS
Date : 22 février 2017
Durée: 1H
Documents : non autorisés
Nb pages : 4
Nom et prénom :…………………………………………………..………………….Groupe : II1…..
Test
Pour chacune des questions suivantes, encerclez LA ou LES bonnes réponse(s) :
1) La programmation orientée objet:
a) favorise la réutilisation logicielle
b) facilite la maintenance des programmes longs
c) n’autorise que la déclaration de méthodes dans les classes
d) encourage la déclaration de méthodes dans les classes
2) Soient les déclarations suivantes :
void f(float a, char b, int c=0) {}
void f(int a, char b, char c) {}
void f(char a, int b) {}
void g(const int x) {}
void g(float &x) {}
float x=12.4567;
int y=4;
char z='a';
const int *t=&y;
Parmi les appels suivants, lesquels sont corrects ?
a) f(y,z,x) ;
b) f(x,z,z) ;
c) f(y,y) ;
d) f(y,z) ;
e) f(y,z,y) ;
f) g(t) ;
g) g(*t) ;
h) g(&x) ;
3) Parmi les fragments de code suivants, lesquels compilent ?
a) int x = 2; const int p = &x; p = 5;
b) const int x = 2; int p = &x; int y =p;
c) int x = 2; int const p = &x; p = 5;
d) int x = 2;int p = &x; int pp = p;
4) Quel est le rôle principal du constructeur d'une classe ?
a) Allouer la mémoire nécessaire à une instance de cette classe
b) Initialiser une instance de cette classe
c) Renvoyer l'adresse de l'objet
d) Défragmenter la mémoire
5) Que se passe-t-il si l'on ne définit pas de constructeur dans une classe ?
a) La compilation échoue
b) Un constructeur qui ne fait rien est généré par le compilateur
c) Un constructeur qui initialise les membres à 0 (ou null) est généré par le
compilateur
d) Un constructeur qui lève une exception INVALID_CTOR est généré par le
6) Quelle est la signature du constructeur de copie d'une classe T ?
compilateur
a) const T& T::T(const T&) ;
b) T& T::T(const T&) ;
c) T T::T(T ) ;
d) T::T(const T ) ;
e) T::T(T ) ;
f) T::T(const T& ) ;
7) Soient les déclarations suivantes
class A {
int x;
public :
void f(int i) {
x=i; }
Advertisement
} ;
class B {
int x;
public :
inline void f(int) ;
} ;
inline void B::f(int x){
this->x = x ; }
a) La classe A est équivalente à la classe B
b) f de la classe B s’exécute plus rapidement que dans A car elle est inline
c) f de la classe B s’exécute plus lentement que dans A à cause de
l’utilisation du pointeur this
1/4
8) Le programme suivant :
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A() {
cout << "A::A()" << endl;
att = 0;
}
~A(){}
A( int a ){att=a;}
private:
int att;
};
class C {
public:
C(){ p=new int ; cout << "C::C()" <<
endl;}
C(int n) : att(A(n)){ p=new int;
cout << "C::C(" << n << ")" << endl;}
~C() { cout << "C::~C()" << endl;
delete p ;
}
protected:
A att;
int* p ;
};
int main()
{ cout << "debut" << endl;
C *c = new C(5);
c->~C();
cout << "fin" << endl;
return 0 ;
}
a) ne compile pas
b) compile et s’exécute correctement
c) compile et provoque une erreur de mémoire
d) compile et provoque une violation de la mémoire
e) compile et provoque une fuite de mémoire
9) Quel sera l’affichage résultant du programme suivant :
class A {
public:
A() { cout << "A"; }
};
class B {
public:
B() { cout << "B"; }
};
a) AB
b) BA
10) Le programme suivant :
class C {
public:
C() : a(), b() {}
private:
Advertisement
B b;
A a;
};
int main() {
C c;}
class B {
int j;
public :
B(int x) : j(x)
{ cout << "B";
}
};
class C {
B objB;
public :
~C(){ cout << "~C";
}
};
void main()
{
C* ptr = new C;
delete ptr ;
}
a) compile et affiche : B~C
b) compile et affiche : BB
c) compile et affiche : ~CB
d) compile et affiche : B
e) ne compile pas
11) Considérons le code c++ suivant :
#include <iostream>
#include <string>
using namespace std;
class Marteau
{
public:
Marteau(int p = 10);
private:
int mPuissance;
};
Marteau::Marteau(int p)
{cout<<"création Marteau";
mPuissance = p;}
class Clou
{
public:
Clou(int force, string etatInit);
bool Clouer(Marteau m);
private:
int mForceNecessaire;
Clou::Clou(int force, string etatInit)
{ cout<<"création Clou";
mForceNecessaire=force ;
mEtat=etatInit ;
}
bool Clou::Clouer(Marteau m)
{
if (m.mPuissance > mForceNecessaire)
{
mEtat = "cloue";
return true;
}
else
{
return false;
}
}
2/4
string mEtat; };
Le programme principal suivant :
int main()
Advertisement
{Marteau m1 = Marteau(28);
Clou c1 = Clou(15, "disponible");
c1.Clouer(m1);
return 0;
}
a) compile et affiche : création Marteau création Clou
b) compile et affiche : création Marteau création Clou création Marteau
c) ne compile pas
12) Considérons le code c++ suivant :
#include <iostream>
#include<string>
using namespace std;
class Mouton
{
public :
Mouton() : epaisseurLaine_(2.0) {};
float getEpaisseurLaine() const { return epaisseurLaine_;}
void setEpaisseurLaine(float epaisseur) {epaisseurLaine_ = epaisseur;}
void croitre() { epaisseurLaine_+= 1.15; }
bool operator==(Mouton m){return(nom==m.nom);}
private :
float epaisseurLaine_;
string nom;
};
Mouton chercher(Mouton*&tab, Mouton m, int pos){ if (tab[pos]==m) return m;}
void croitre(Mouton mouton){ mouton.setEpaisseurLaine( mouton.getEpaisseurLaine() +
1.15 );}
void tondre(Mouton mouton) { mouton.setEpaisseurLaine( 0.8 );
}
Si on exécute le programme suivant, combien d’objets de type Mouton sont créés ?
int main()
{ Mouton mouton;
Mouton * tab=new Mouton[3];
chercher(tab,mouton, 2);
mouton.croitre();
croitre(mouton);
croitre(mouton);
tondre(mouton);
return 0;
}
a) un
b) trois
c) quatre
d) cinq
e) dix
13) Que se passe-t-il si l'on ne définit pas d'opérateur d'affectation dans une
classe ?
a) La compilation échoue
b) Un opérateur = qui ne fait rien est généré par le compilateur
c) Un operateur = qui fait une copie membre à membre est généré par le
compilateur
d) Un operateur = qui fait un appel au constructeur de copie est généré par le
compilateur
14) La surcharge d’un opérateur binaire avec une fonction membre (méthode) nécessite
combien d’arguments ?
a) zéro
b) un
c) deux
d) trois
15) La surcharge d’un opérateur unaire avec une fonction amie nécessite combien
d’arguments ?
a) zéro
b) un
c) deux
d) trois
3/4
16) Soit une classe T et son instance t. Quelle fonction faut-il implémenter pour
pouvoir écrire le code suivant : cout << t ;
a) void T::operator << (ostream & os) { … }
b) void operator << (const T& t, ostream & os) { … }
Advertisement
c) ostream& T::operator << (ostream & os) { … }
d) ostream& operator << (ostream & os, const T& t) { … }
17) Une variable déclarée avec « static » est :
a) une variable constante qui ne change pas de valeur
b) un attribut membre d’une classe dont la valeur est commune à toutes les
instances
18) Le programme suivant :
template <class T> class point
{ T x ; T y ;
public :
static int ctr;
point (T abs=0, T ord=0) {
x = abs ; y = ord ; ctr++ ;}
} ;
template <class T> int point<T>::ctr = 0 ;
int main()
{
point<int> p1,p2;
point<float> p3;
cout<<p3.ctr ;
return 0;
}
a) compile et affiche : 0
b) compile et affiche : 1
c) compile et affiche : 2
d) compile et affiche : 3
e) ne compile pas
19) Le programme suivant :
template <class T> class point
{
public :
T x ; T y ;
point (T abs=0, T ord=0) { x = abs ; y = ord ;
}
void affiche() {cout << "(x=" << x << " )";
cout << "(y=" << y << ")"<<
endl;}
} ;
template <class T,class U> point<T>&
operator+(point<T>& a, point<U>& b)
{
point<T> c;
c.x = a.x + (T) (b.x) ;
c.y = a.y + (T) (b.y) ;
return c;
}
a) compile et affiche :(x=0) (y=0)
b) compile et affiche :(x=13) (y=6)
c) compile et affiche :(x=8) (y=2)
d) ne compile pas
20) Soit la définition suivante d’un patron de classes :
int main()
{
point<int> p1,p2(8,2);
point<float> p3(5.2,4.8);
p1 = p2+p3;
p1.affiche();
return 0;}
template <class T, int n> class essai
{ T tab [n] ;
public :
essai (T) {} // constructeur
} ;
Quelles sont les instructions correctes parmi les instructions suivantes ?
a) essai <int, 10> ei (3) ;
b) essai <float, 10.0> ef (0.0) ;
c) essai <double, 10> ed (2.5) ;
4/4