Documente Academic
Documente Profesional
Documente Cultură
Ppoo Sesiunea Ianuarie 2011
Ppoo Sesiunea Ianuarie 2011
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:
d.
p->v();
2
Programarea generica este:
4
Fie programul: class Persoana{ public: Persoana(char * n){nume=n;} void afisare(){cout<<nume<<endl;} char *nume; }; Constructorul Persoana(char *) poate fi utilizat pentru:
5
Polimorfismul:
b.
utilizeaza legarea dinamica
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:
Answer Selected Answer: d. Definitia void s(int i)supraincarca definitia void s()
7
Utilizarea metodelor iniline duce la:
d.
8
Programarea cu template este:
9
Problema diamantului este data de :
d.
polimorfism
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: ~W(){ cout<<"W::~W()"<<endl;} };
class R { public: ~R(){ cout<<"R::~R()"<<endl;} }; class File: public W, public R { public: ~File(){ cout<<"File::~File()"<<endl;} }; int main (int argc, char* argv[]) { R* f = new File(); delete f; return 0; }
a. R::~R()
Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a constructorilor. Ce se va afisa pe ecran?
classW { public: W(){ }; classR { public: R(){ }; classFile: publicW, publicR { public: File(){ cout<<"File::File()"<<endl;} }; intmain (intargc, char* argv[]) { R* f = new File(); return0; }
cout<<"W::W()"<<endl;}
cout<<"R::R()"<<endl;}
Answer 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: 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; }
b. R::~R()
11 Analizati cu atentie urmatorul fragment de cod sursa. Cate clase si cate obiecte avem in programul urmator ?
template<typename T=int, int dim=100> class Vector { T v[dim]; public: Vector(){ memset(v,0,sizeof(v)); } ~Vector(){} void Print(ostream &os) { for (int i=0;i<dim;i++) os << v[i] << ' '; os<<endl; } }; Vector<int, 2> test; int main(int argc, char* argv[]) { Vector<int, Vector<int, Vector<int, Vector<int, 10> 10> 20> 20> v1, v2, &v3=v1; *v4 = &v3; v5; v6(v5);
return 0; }
e. 1 clasa si 5 obiecte
14
Fie urmatorul program: 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: c. p->m();
9. 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 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; }
c. A::Create(16)
17 Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a destructorilor. Ce se va afisa pe ecran?
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; }
d. S::~S() C2::~C2() C1::~C1() 18 Analizati cu atentie urmatorul fragment de cod sursa. Se doreste introducerea in definitia sablonului de clasa Vector a unui operator de extractie care sa permita o extracie inlantuita, precizati care este declaratia corecta ?
template<typename T=int, int dim=100> class Vector { T v[dim]; public: Vector(){ memset(v,0,sizeof(v)); } ~Vector(){} T &operator[](int i){ return v[i];}
b.
template<typename T, int dim> friend istream & operator>>(istream &, Vector<T,dim>&);
19
Analizati cu atentie codul urmator. Care este ordinea de apel a destructorilor? class Shape { public: Shape() { cout<<"Shape::Shape"<<endl;} virtual ~Shape(){ cout<<"Shape::~Shape"<<endl; } }; class Point:public Shape { int x,y; public: Point(){ cout<<"Point::Point"<<endl;} virtual ~Point(){ cout<<"Point::~Point"<<endl; } }; class Circle:public Point { int radius; public: Circle(int r = 0) { cout<<"Circle::Circle"<<endl;} virtual ~Circle() { cout<<"Circle::~Circle"<<endl;} }; int main() { Shape * v[10]; int n = 0; v[n++] = new Circle(); v[n++] = new Point(); for(int i = 0; i<n; i++) return 0; } delete v[i];
d. Circle::~Circle Point::~Point Shape::~Shape Point::~Point Shape::~Shape 20 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 Answer d.
Conversia obiectelor Complex in numere reale 21
Fie programul : 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){}; virtual 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 : Answer 15 22 Analizati cu atentie urmatorul fragment de cod sursa. Se doreste introducerea in definitia sablonului de clasa Vector a unui operator de acces intexat care sa permita modificarea elementelor vectorului, precizati care este declaratia corecta ?
template<typenameT=int, intdim> classVector {
23 Analizati cu atentie urmatorul fragment de cod sursa. Deduceti ce calcul efectueaza sablonul urmator si se va afisa pe ecran?
template<intN, intLO=1, intHI=N> classCalcul { public: enum{ mid = (LO+HI+1)/2 }; enum{ result = (N<mid*mid) ? Calcul<N,LO,mid-1>::result : Calcul<N,mid,HI>::result }; }; //pentru cazul cand LO == HI template<intN, intM> classCalcul<N,M,M>{ public: enum{ result = M }; }; intmain(intargc, char* argv[]) { int x = Calcul<10>::result; cout <<x<<endl; return0; }
Answer c. 3 24
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;} }; 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:
Answer 4 25
problema diamantului
26
0 din 20 puncte Analizati cu atentie urmatorul fragment de cod sursa. Se doreste introducerea in definitia sablonului de clasa Vector a unui operator de extractie care sa permita o extracie inlantuita, precizati care este declaratia corecta ?
template<typename T=int, int dim=100> class Vector { T v[dim]; public: Vector(){ memset(v,0,sizeof(v)); } ~Vector(){} T &operator[](int i){ return v[i];}
27
Programarea cu sabloane permite:
Answer Selected Answer: d.
}; 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); a[0]=-100; cout<<(x=y)<<endl; } Programul afiseaza:
Answer Selected Answer: a.
-100 2 3
30
ntrebarea nr. 10
0 din 10 puncte Analizati cu atentie urmatorul fragment de cod sursa. Alegeti observatia corecta si precizati ce se va afisa pe ecran?
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; } void Print(){ cout << p << endl; } }; int main(int argc, _TCHAR* argv[]) { Sir a("Programare in C++"); { Sir b("Proiectare orientata pe obiecte"); a = b; } a.Print(); return 0;
}
Answer Selected Answer: e.
31
Analizati cu atentie urmatorul fragment de cod sursa. Alegeti observatia corecta si precizati ce se va afisa pe ecran?
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; } void Print(){ cout << p << endl; } }; int main(int argc, _TCHAR* argv[]) { Sir a("Programare in C++"); { Sir b("Proiectare orientata pe obiecte"); a = b; } a.Print(); return 0; }
Answer Selected Answer: a. Nu se poate spune ce se afiseaza, codul nu se compileaza 20 din 20 puncte Analizati cu atentie urmatorul fragment de cod sursa. Alegeti observatia corecta ?
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; }
Answer Selected Answer: a. codul este corect , se compileaza dar ruleaza la infinit
Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a constructorilor si destructorilor. Ce se va afisa pe ecran?
class Baza { public: Baza(){ cout<<"B::B()"<<endl;} virtual ~Baza(){ cout<<"B::~B()"<<endl;} }; class Derivat:public Baza { public: Derivat(){ cout<<"D::D()"<<endl;} virtual ~Derivat(){ cout<<"D::~D()"<<endl;} }; int main (int argc, char* argv[]) { Baza *s = new Derivat(); return 0; }
Answer Selected Answer: b. D::D() B::B() B::~B() D::D()
32
Fie urmatorul program: 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;
c.
p->m();
Fie urmatorul program: class C{ public: C(int n=0, int v[]); 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; b[0]= -100; cout<<x<<endl; } Programul afiseaza: {
d.
-100 20
Fie urmatorul program: class C{ public: C(int n=0, int v[]); friend ostream& operator<<(ostream &o, const C&); private: int dim; int *pi; };
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); a[0]=-100; cout<<(x=y)<<endl; } Programul afiseaza:
b.
10 20
Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a constructorilor si destructorilor. Ce se va afisa pe ecran?
class Baza { public: Baza(){ cout<<"B::B()"<<endl;} virtual ~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[]) { Baza *s = new Derivat(); delete s; return 0; }
26 Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a constructorilor. Ce se va afisa pe ecran?
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; }
37 Analizati cu atentie urmatorul fragment de cod sursa. Alegeti observatia corecta si precizati ce se va afisa pe ecran?
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; } void Print(){ cout << p << endl; } }; int main(int argc, _TCHAR* argv[]) { Sir a("Programare in C++"); { Sir b("Proiectare orientata pe obiecte"); a = b; } a.Print(); return 0;
Answer b.
Proiectare orientata pe obiecte,
38 Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a constructorilor si destructorilor. 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[]) { Baza *s = new Derivat(); delete s; return 0; }
a. D::D() D::~D()
39
Problema diamantului este data de :
40 Analizati cu atentie urmatorul fragment de cod sursa. Precizati ce catitate de memorie se aloca pentru clasele care urmeaza pe o platforma pe 64biti?
class Empty { typedef int Int; nonempty public: Empty(){} ~Empty(){} };
{ public: EmptyToo(){} virtual ~EmptyToo(){} }; class EmptyThree : public EmptyToo { public: EmptyThree(){} virtual ~EmptyThree(){} }; int main() { std::cout << sizeof(Empty)<< << sizeof(EmptyToo)<< << sizeof(EmptyThree)<<endl; return 0; }