Ex2 Analizati Cu Atentie Urmatorul Fragment de Cod Sursa. Precizati Care Este Ordinea de Apel A Destructorilor. Ce Se Va Afisa Pe Ecran? Cod

Download as rtf, pdf, or txt
Download as rtf, pdf, or txt
You are on page 1of 16

Ex2 Analizati cu atentie urmatorul fragment de cod sursa.

Precizati care este ordinea de apel a


destructorilor. Ce se va afisa pe ecran?

Cod:
class W
{
public:

virtual ~W(){ cout<<"W::~W()"<<endl;}


};

class R
{
public:

virtual ~R(){ cout<<"R::~R()"<<endl;}


};
class File: public W, public R
{
public:

virtual ~File(){ cout<<"File::~File()"<<endl;}


};
int main (int argc, char* argv[])
{

R* f = new File();
delete f;
return 0;
}

Raspuns:
File::~File()
R::~R()
W::~W()
Ordine de distrugerea a obiectele este inversa fata de ordine creerii,
cand am creat s-a apelat pe rand constructorii
File::File()
W::W()
R::R()

cand distrugem se apeleaza invers clasele derivate


File::~File()
R::~R()
W::~W()
Ex 3

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;}

virtual ~A(){ cout<<"A::~A()"<<endl;}


void Create(int d = 0x10)
{
dim = d;
cout<<"A::Create("<<dim<<")"<<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)
Ex:4
Fie urmatoarea specificare de clasa:

Cod:
class AbstractList{
public:

virtual void erase()=0;


virtual void put(AbstractElem* ae)=0;
virtual AbstractElem* get()=0;
virtual int isEmpty()=0;
virtual int isFull()=0;
};

Care declarare este corecta:


AbstractList *pa;
AbstractList a;
AbstractList *pa=new AbstractList();
AbstractList *pa=&a;
Ex:5
Fie urmatorul program:
Cod:

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;}

};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<<endl; return 1;}

// 2. specializare metoda statica


void s(int i){i++;cout<<"void B::s(int)"<<endl; }

// 3. specializare metoda virtuala


virtual void v(int i){i++;cout<<"virtual void B::v(int)"<<endl;}

// 4. supraincarcare metoda virtuala,


virtual int v(){cout<<"int B::v()"<<endl; return 1;}
};

Care definitie este incorecta:


4.
1.
2.
3.
virtual void v() este in A si in b este int functia virtuala trebuie sa isi pastreze prototipul
referitor la un post mai vechi.

e corect raspunsul 4 deoarce

//4.supraincarcare metoda virtuala,


virtual void v(){count<<"int B::()"<<endl:return1}

la compilare va da eroare corect trebuie scris asa


// 4.supraincarcare metoda virtuala,
int void v(){count<<"int B::()"<<endl;return 1;}
Ex:6

Fie urmatoarea specificare de clase:

Cod:
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:: operator float() este utilizata pentru

Raspuns:
Normal operator float() returneaza x dar care x ?
float e cuvant rezervat lui C++ si nu stiu daca poate fi rescris

float x,y;
};

X-ul ingrosat il returneaza


ex:7

Fie urmatorul program:

Cod:
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:


b.m();
b.v();
p->f();
p->m(); raspuns bun

deoarce m si v din B sunt private


Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
constructorilor. Ce se va afisa pe ecran?
class Baza
{
public:
Baza(){ cout<<"B::B()"<<endl;}
Baza(Baza &b){ cout<<"B::B(B&)"<<endl;}
~Baza(){ cout<<"B::~B()"<<endl;}

};

int main (int argc, char* argv[])


{
Baza a;
Baza b = a;
Baza c(b);

return 0;
}
B::B(B&)
B::B(B&)
B::B(B&)
B::B()
B::B(B&)
B::B(B)
B::B()
B::B(B)
B::B(B&)
B::B()
B::B(B&)
B::B(B&)
B::B()
B::B()
B::B()

Baza a;=B::B()
Baza b = a;=B::B(B&)
Baza c(b);=B::B(B&)
Ex1:

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 Baza2
{
public:
Baza2(){ Create(); }
~Baza2(){ Create(); }

void Build(){Create(); }

virtual void Create(int d = 0x10)


{
cout<<"B::Create: d = "<< d << endl;
}
};

class Derivat2:public Baza2


{
public:
Derivat2(){ }

virtual void Create(int d = 0x100)


{
cout<<"D::Create: d = "<< d << endl;
}
};
int main (int argc, char* argv[])
{
Baza2 *p = new Derivat2();
p->Build();
delete p;
return 0;
}

Raspuns:
B::Create: d = 16
D::Create: d = 16
B::Create: d = 16
9.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:: operator float() este utilizata pentru

Conversia unui numar real in obiect Complex


Conversia unui obiect Complex in obiect Punct
Conversia obiectelor Complex in numere reale Raspuns Bun
Conversia unui obiect Punct in obiect Complex

10. EX Examen :
Fie urmatoarea specificare de clasa:
//file abslist.h
#ifndef ABSLIST_H
#define ABSLIST_H
#include “d:\tudor\c_cpp\abstract\abselem.h*
class AbstractList{
public:
virtual void erase()=0;
virtual void put(abstractElm*ae)();
virtual AbstractElm*get()();
virtual int isEmpty()();
virtual int isFull()();
};
#endif

Care afirmatie este corecta?

A. AbstractList este o clasa abstracta


B. isEmpty este metoda virtuala pura
C. AbstractList este o clasa concreta
D. Obiectele clasei pot fi construite cu AbstractList()

11. 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

12.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

13. EX Examen

#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,-100);

cout<<x<<endl;

Raspuns
Programul afiseaza:

-100 20

14. EX Examen :

Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
constructorilor. Ce se va afisa pe ecran?
class Baza
{
public:
Baza(){ cout<<"B::B()"<<endl;}
Baza(Baza &b){ cout<<"B::B(B&)"<<endl;}
~Baza(){ cout<<"B::~B()"<<endl;}

};

int main (int argc, char* argv[])


{
Baza a;
Baza b = a;
Baza c(b);

return 0;
}
B::B(B&)
B::B(B&)
B::B(B&)
B::B()
B::B(B&)
B::B(B)
B::B()
B::B(B)
B::B(B&)
B::B()
B::B(B&)
B::B(B&)
B::B()
B::B()
B::B()

Baza a;=B::B()
Baza b = a;=B::B(B&)
Baza c(b);=B::B(B&)

15. Ex examen

#include <iostream.h>
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

You might also like