Documente Academic
Documente Profesional
Documente Cultură
1. Analizati cu atentie urmatorul fragment de cod sursa. Alegeti observatia corecta ? - 20 points -
restanta
class Sir
{
int len;
char *p;
public:
Sir(char * s=NULL)
{
p = NULL;
len =0;
if(s)
{
len = strlen(s);
p = new char[len+1];
strcpy_s(p,len+1, s);
}
}
~Sir(){ if (p) delete[] p; }
};
int main(int argc, char* argv[])
{
while(true)
{
Sir * ps = new Sir("Programare in C++");
delete ps;
}
return 0;
}
class Baza
{
public:
Baza(){ cout<<"B::B()"<<endl;}
Baza(Baza &b){ cout<<"B::B(B&)"<<endl;}
~Baza(){ cout<<"B::~B()"<<endl;}
};
return 0;
}
a)B::B(B&)
B::B(B&)
B::B(B&)
b)B::B()
B::B(B&)
B::B(B)
c)B::B()
B::B(B)
B::B(B&)
D) B::B()
B::B(B&)
B::B(B&)
e)B::B()
B::B()
B::B()
Pentru ca :
Baza a;=B::B()
Baza b = a;=B::B(B&)
Baza c(b);=B::B(B&)
4) Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
constructorilor. Ce se va afisa pe ecran? 10 point
class Clasa1
{
public:
Clasa1(){ cout<<"C1::C1()"<<endl;}
};
class Clasa2
{
public:
Clasa2() { cout<<"C2::C2()"<<endl;}
};
class System
{
Clasa1 ob1;
Clasa2 ob2;
public:
System() { cout<<"S::S()"<<endl;}
};
int main (int argc, char* argv[])
{
System a;
return 0;
}
a) S::S()
C1::C1()
C2::C2()
b) S::S()
C2::C2()
C1::C1()
C) C1::C1()
C2::C2()
S::S()
d) S::S()
e ) C1::C1()
C2::C2()
5 ) Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
destructorilor. Ce se va afisa pe ecran? - 10 points
class Clasa1
{
public:
~Clasa1(){ cout<<"C1::~C1()"<<endl; }
};
class Clasa2
{
public:
~Clasa2(){ cout<<"C2::~C2()"<<endl;}
};
class System
{
Clasa1 ob1;
Clasa2 ob2;
public:
System():ob2(),ob1(){ }
virtual ~System(){ cout<<"S::~S()"<<endl;}
};
int main (int argc, char* argv[])
{
System a;
return 0;
}
a) C2::~C2()
C1::~C1()
S::~S()
b) C1::~C1()
C2::~C2()
S::~S()
c) S::~S()
d) S::~S()
C1::~C1()
C2::~C2()
E) S::~S()
C2::~C2()
C1::~C1()
5A) .Exercitiu examen
Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel pe ecran a
destructorilor. Ce va afisa pe ecran ?
#include <iostream>
Raspuns:
a) S::~S()
C1::~C1()
C2::~C2()
6) Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
destructorilor. Ce se va afisa pe ecran?
class W
{
public:
class R
{
public:
R* f = new File();
delete f;
return 0;
}
a) R::~R()
W::~W()
File::~File()
b) File::~File()
W::~W()
R::~R()
C) File::~File()
R::~R()
W::~W()
d) File::~File()
R::~R()
R::~R()
7) Ex restanta
Precizati care este ordinea de apel a constructorilor si destructorilorl Ce se va afisa pe ecran?
Class Baza
{
public:
Baza( ) { cout<<”B::B ( ) “ ( ) <<endl; }
~ Baza( ) { cout<<”B::~ B ( ) “ ( ) <<endl; }
};
class Derivat : public Baza
public:
Derivat ( ) { cout<<”D: : D ( ) « <<endl>>
~Derivat ( ) { cout<<”D:: ~D ( ) « <<endl>>
};
int main ( int argc, char* argv[]
};
a) D::D()
B::B()
B::~B()
b) D::D()
B::B()
B::~B()
D::D()
c) B::B()
B::~B()
D) B::B()
D::D()
B::~B()
e) B::B()
D::D()
D::~D()
B::~B()
Raspuns : D
8) Examen : Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este efectul apelarii
metodei Create(), ce varianta a functiei se va apela si ce se afiseaza pe ecran?
class Baza2
{
public:
Baza2(){ Create(); }
~Baza2(){ Create(); }
void Build(){Create(); }
Raspuns:
B::Create: d = 16
D::Create: d = 16
B::Create: d = 16
9) EX Examen : Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este efectul
apelarii metodei Create(), ce varianta a functiei se va apela si ce se afiseaza pe ecran?
Cod:
class A
{
protected:
int dim;
public:
A(){ cout<<"A::A()"<<endl;}
class B: public A
{
public:
B(){ cout<<"B::B()"<<endl;}
virtual ~B(){ cout<<"B::~B()"<<endl;}
virtual void Create(int d = 0x100)
{
dim = d;
cout<<"B::Create("<<dim<<")"<<endl;
}
};
int main(int argc, char* argv[])
{
A* p = new B();
p->Create( );
delete p;
return 0;
}
Raspuns:
A::Create(16)
10. Ex examen
Fie urmatorul program
class A{
public:
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int)"<<endl; }
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<endl;}
};
Care afirmatie este corecta:
A. Definitia virtual void v()supraincarca definitia virtual void v(int i)
b. Definitia virtual void v(int i) este incorecta deoarece exista o definitie pentru metoda v.
c. void v() este metoda ce va fi legata static.
d. in expresia p->v(); metoda v este legata static
class AbstractList{
public:
class AbstractList{
public:
virtual void erase()=0;
virtual void put(AbstractElem* ae){};
virtual AbstractElem* get(){};
virtual int isEmpty(){};
virtual int isFull(){};
};
Care afirmatie este corecta:
13) EX Examen :
Fie urmatorul program:
class A{
public:
};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<<endl; return 1;}
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
p=&b;
p->m();
p->v();
}
Care expresie este corecta:
a) b.m();
b) b.v();
c) p->f();
D) p->m(); - Corect
Raspunsul este p->m ( pentru ca p->f nu exista iar b.m si b.v sunt private.)
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
p=&a; p->m(); p->v();
p=&b; p->m(); p->v();
}
Care expresie este incorecta:
a) p=&a;
B) b.m();
c) p->m();
d) p->v();
16) EX Examen :
Fie programul :
#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
void operator++(){raza++;}
private:
float raza;
};
class Cilindru: public Cerc{
public:
Cilindru(float raza, float inaltime):Cerc(raza), inaltime(inaltime){};
void operator++(){inaltime++;}
float getInaltime(){return inaltime;}
private:
float inaltime;
};
void main(){
Cerc *pc;
Cilindru c(1,5);
pc=&c;
++ *pc;
cout<<pc->getRaza()<<" "<<c.getInaltime()<<endl;
getch();
}
Programul afiseaza :
25
17) EX Examen :
Fie urmatoarea specificare de clase:
class Complex;
class Punct{
public:
Punct(float x=0, float y=0):x(x),y(y){}
operator Complex();
operator float(){return x;}
private:
float x,y;
};
class Complex{
public:
Complex(float x=0, float y=0):x(x),y(y){}
operator Punct(){return Punct(x,y);}
operator float(){return x;}
private:
float x,y;
};
18) EX Examen
Fie programul:
class Persoana{
public:
Persoana(char * n){nume=n;}
void afisare(){cout<<nume<<endl;}
char *nume;
};
Constructorul Persoana(char *) poate fi utilizat pentru:
a. Conversia obiectelor Persoana in siruri de caractere
B Conversia sirurilor de caractere in obiecte Persoana
c. Construirea de siruri de caractere
d. Conversia obiectelor Complex in obiecte Persoana
EX. 19) Fie urmatoarea specificare de clase:
class Complex;
class Punct{
public:
Punct(float x=0, float y=0):x(x),y(y){}
operator Complex();
operator float(){return x;}
private:
float x,y;
};class Complex{
public: Complex(float x=0, float y=0):x(x),y(y){}
operator Punct(){return Punct(x,y);}
operator float(){return x;}
private:
float x,y;
}; Metoda Complex::
Conversia unui obiect Punct in obiect Complex
Ex. 20)
Fie programul:
class Persoana{
public:
Persoana(char * n){nume=n;}
void afisare(){cout<<nume<<endl;}
char *nume;
};
Constructorul Persoana(char *) poate fi utilizat pentru:
Conversia sirurilor de caractere in obiecte Persoana
Ex 21)
Fie urmatoarea specificare de clase:
class Complex
class Punct{
public:
Punct(float x=0, float y=0)x(x),y(y)()
Operator Complex();
Operator float(){return x;)
private:
float x,y;
};
class Complex{
public:
Complex(float x=0, float y=0)x(x),y(y)()
operator Complex();
operator float(){return x;}
private:
float x,y;
};
Metoda Complex: operator float() este utilizata pentru:
Conversia unui obiect Complex in obiect Punct
Ex. 22)
Ex 23 ) EX Restante
Ex 24
Fie urmatorul program:
// Constructor cu semantica prin referinta
// Operatorul = este cel implicit
#include <iostream.h>
class C{
public:
C(int n=0, int v[]);
void set(int i, int val){pi[i]=val;}
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
x=y;
y.set(0,-1000);
cout<<x<<endl;
}
Programul afiseaza: -1000 20
Ex 25.
Fie programul:
#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
Cerc operator++(){raza++;return *this;}// return by value
Cerc operator--(){raza--;return *this;}// return by value
private:
float raza;
};
void main(){
Cerc c(1.0);
cout<<(++(++c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;
cout<<(--(--c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;
} Programul afiseaza : 3 2 0 1
Ex 26
Fie programul :
// Constructor cu semantica prin referinta
// Operatorul = cu semantica prin valoare si stergere destinatie
#include <iostream.h>
class C{
public:
C(int n=0, int v[]);
C& C::operator=(C& x);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
C& C::operator=(C& x){
// stergerea valorior din vectorul destinatie, care oricum vor fi modificate
delete[] pi;
// atribuire
dim=x.dim;
pi=new int[dim];
for(int j=0; j<dim; j++){pi[j]=x.pi[j];}
return *this;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
x=y ;
b[0]=-1000;
cout<<x<<endl;
} Programul afiseaza: 10 25
Ex 27)
Raspuns : ?