Skip to content

Programare Orientată pe Obiecte

aliasbind edited this page Sep 8, 2012 · 37 revisions

Examinarea codului

Salt rapid

2005 01 02 03 04 05 06 07 08 09 10 11 12
2006 13 14 15 16 17 18 19 20 21 22 23 24
2007 25 26 27 28 29 30 31 32 33 34 35 36
2008 37 38 39 40 41 42 43 44 45 46 47 48
2009 49 50 51 52 53 54 55 56 57 58 59 60

Sari la teorie


1. Spuneți de câte ori se execută fiecare constructor în programul de mai jos și în ce ordine.

#include <iostream.h>

class cls1
{
protected:
    int x;

public:
    cls1() { x = 13; }
};

class cls2: public cls1
{
    int y;

public:
    cls2() { y = 15; }
    int f(cls2 ob) { return ob.x + ob.y; }
};

int main()
{
    cls2 ob; 
    cout << ob.f(ob);
    return 0;
}

2. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, altfel, spuneți de ce nu este corect.

#include <iostream.h>

class cls1
{
    int x;

public:
    cls1(){ x = 13; }
    int g()
    {
        static int i;
        i++;
        return i + x;
    }
};

class cls2
{
    int x;

public:
    cls2() { x = 27; }
    cls1& f()
    {
        static cls1 ob;
        return ob;
    }
};

int main()
{
    cls2 ob;
    cout << ob.f().g();
    return 0;
}

3. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, altfel, spuneți de ce nu este corect.

#include <iostream.h>

class cls1
{
protected:
    int x;

public:
    cls1(int i = 10) { x = i; }
    int get_x() { return x; }
};

class cls2: cls1
{
public:
    cls2(int i) : cls1(i) {}
};

int main()
{
    cls d(37);
    cout << d.get_x();
    return 0;
}

4. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, altfel, spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;

public:
    cls(int y) { x = y; }
    int operator*(cls a, cls b) {return a.x * b.x; }
};

int main()
{
    cls m(100), n(15);
    cout << m*n;
    return 0;
}

5. Cum trebuie definită variabila n din clasa de mai jos, dacă dorim ca ea să contorizeze numărul tuturor obiectelor care aparțin clasei cls la un moment dat?

class cls
{
    int n;

public:
    cls()  { n++; }
    ~cls() { n--; }
};

6. Fiind date următoarele tipuri de clase:

class B { /* instructiuni */ };
class D1: virtual B { /* instructiuni */ };
class D2: virtual B { /* instructiuni */ };
class D3: B { /* instructiuni */ };
class D4: private B { /* instructiuni */ };
class D5: virtual public B { /* instructiuni */ };
class M1: D1, public D2, D3, private D4, virtual D5
{ /* instructiuni */ };
class M2: D1, D2, virtual D3, virtual D4, virtual D5
{ /* instructiuni */ };

spuneți de câte ori este moștenită clasa B în clasa M1. Dar în clasa M2? Justificați.


7. Spuneți care dintre declarațiile funcției main() sunt corecte în programul de mai jos. Justificați.

#include <iostream.h>

class B1
{
public:
    int x;
};

class B2
{
    int y;
};

class B3
{
public:
    int z;
};

class B4
{
public:
    int t;
};

class D: private B1, protected B2, public B3, B4
{
    int u;
};

int main()
{
    D d;
    cout << d.u;
    cout << d.x;
    cout << d.y;
    cout << d.z;
    cout << d.t;
    return 0;
}

8. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int vi;

public:
    cls(int v = 37) { vi = v; }
    friend int& f(cls);
};

int& f(cls c) 
{
    return c.vi;
}

int main()
{
    const cls d(15);
    f(d) = 8;
    cout << f(d);
    return 0;
}

9. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, altfel, spuneți de ce nu este corect.

#include <iostream.h>

class cls1
{
public:
    int x;
    cls1(int i = 20) { x = i; }
};

class cls2
{
public:
    int y;
    cls2(int i = 30) { y = i; }
    operator cls1()
    {
        cls1 ob;
        ob.x = y;
        return ob;
    }
};

cls1 f(cls1 ob)
{
    ob.x++;
    return ob;
}

int main()
{
    cls1 ob1;
    f(ob1);
    cout << ob1.x;
    
    cls2 ob2;
    f(ob2);
    cout << ob2.y;
    
    return 0;
}

10. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, altfel, spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;

public:
    cls(int i = 25) { x = i; }
    int f();
};

int cls::f() { return x; }

int main()
{
    const cls d(15);
    cout << d.f();
    return 0;
}

11. Spuneți de câte ori se apelează destructorul clasei cls în programul de mai jos. Justificați.

#include <iostream.h>

class cls
{
public:
    int x;
    cls(int i = 0) { x = i; }
};

cls f(cls c)
{
    c.x++;
    return c;
}

int main()
{
    cls r(10);
    cls s = f(r);
    return 0;
}

12. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

template <class tip>
tip dif(tip x, tip y)
{
    return x-y;
}

unsigned dif(unsigned x, unsigned y)
{
    return x >= y ? x-y : y-x;
}

int main()
{
    unsigned i=7, j=8;
    cout << dif(i,j);
    return 0;
}

13. Spuneți dacă programul de mai jos este corect. În caz afirmativ, precizați exact constructorii care se execută și în ce ordine. În caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls1
{
public:
    int x;
    cls1(int i = 13) { x = i; }
};

class cls2: virtual public cls1
{
public:
    cls2(int i = 15) { x = i; }
};

class cls3: virtual public cls1
{
public:
    cls3(int i = 17) { x = i; }
};

class cls4: public cls1
{
public:
    cls4(int i = 19) { x = i; }
};

class cls5: public cls2, public cls3, public cls4
{
public:
    int y;
    
    cls5(int i, int j) : cls4(i), cls2(j)
    {
        y = i + j;
    }

    cls5(cls5& ob)
    {
        y = -ob.y;
    }
};

int main()
{
    cls5 ob1(-9,3), ob2 = ob1;
    cout << ob2.y;
    return 0;
}

14. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;
    const int y;

public:
    cls(int i, int j) : x(i), y(j) {}
    int imp(int, int) const;
};

int imp(int i, int j) const
{
    x = i;
    y = j;
    return x+y; 
}

int main()
{
    cls ob(5);
    cout << ob.imp(-9,8);
    return 0;
}

15. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int a;

public:
    B(int i=0)  { a = i; }
    int get_a() { return a; }
};

class D: private B
{
public:
    D(int x=0) : B(x) {}
    int get_a() { return B::get_a(); }
};

int main()
{
    D d(-89);
    cout << d.get_a();
    return 0;
}

16. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
protected:
    int x;
    B(int i = 10) { x = i; }

public:
    virtual B operator+(B ob)
    {
        B y(x + ob.x);
        return y;
    }
};

class D: public B
{
    public: D(int i = 10) { x = i; }
    void operator=(B p) { x = p.x; }
    
    B operator+(B ob)
    {
        B y(x + ob.x + 1);
        return y;
    }

    void afisare() { cout << x; }
};

int main()
{
    D p1(-59), p2(32), *p3=new D;
    *p3=p1+p2;
    p3->afisare();
    return 0;
}

17. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
public:
    int sa;
    cls(int s = 0) { sa = s; }
    operator int() { return sa; }
    int f(int c) { return sa * (1 + c/100); }
};

int main()
{
    cls p(37);
    cout << p.f(p);
    return 0;
}

18. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
public:
    int x;
    B(int i = 0) { x = i; }
    virtual B aduna(B ob) { return x + ob.x; }
    B minus() { return 1-x; }
    void afisare(){ cout << x; }
};

class D: public B
{
public:
    D(int i = 0) { x = i; }
    B aduna(B ob) { return x + ob.x + 1; }
};

int main()
{
    B *p1, *p2;
    p1 = new D(138);
    p2 = new B(-37);
    *p2 = p2->aduna(*p1);
    *p1 = p2->minus();
    p1->afisare();
    return 0;
}

19. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

template <class tip>
class cls
{
    tip z;
    public: cls(tip i) { z = i; }
    tip operator-(cls);
};

template <class tip>
tip cls<tip>::operator-(cls<tip> a)
{
    return z - a.z;
}

template <class tip>
tip dif(tip x, tip y)
{
    return x - y;
}

int dif(int x, int y)
{
    return x >= y ? x-y : y-x;
}

int main()
{
    cls<int> i=3; cls<float> j=4;
    cout << dif(i,j);
    return 0;
}

20. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    static int x;

public:
    cls(int i = 25) { x = i; }
    friend int& f(cls);
};

int cls::x = -13;

int& f(cls c)
{
    return c.x;
}

int main()
{
    cls d(15);
    cout<<f(d);
    return 0;
}

21. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int v, nr;

public:
    cls(int i)
    {
        nr = i;
        v = new int[i];
    }

    friend int& operator[](int);
    friend ostream& operator<<(ostream&, cls);
};

int& operator[](cls& x, int i)
{
    return x.v[i];
}

ostream& operator<<(ostream& o, cls x)
{
    for(int i=0; i<x.nr; i++)
        cout << x.v[i] <<" ";
    return o;
}

int main()
{
    cls x(10);
    x[5] = 7;
    cout << x;
    return 0;
}

22. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    static int i;
    int j;

public:
    cls(int x=7) { j = x; }
    static int imp(int k)
    {
        cls a;
        return i + k + a.j;
    }
};

int cls::i;

int main()
{
    int k=5;
    cout << cls::imp(k);
    return 0;
}

23. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;

public:
    cls(int i = 32) { x = i; }
    int f() const;
};

int cls::f() const
{
    return x++;
}

void main()
{
    const cls d(-15);
    cout << d.f();
}

24. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează pentru o valoare întreagă citită egală cu 7, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

float f(float f)
{
    if(f) throw f;
    return f/2;
}

int main()
{
    int x;

    try
    {
        cout << "Da-mi un numar intreg: ";
        cin >> x;
        if(x) f(x);
        else throw x;
        cout << "Numarul " << x << " e bun!" << endl;
    }
    catch (int i)
    {
        cout << "Numarul " << i << " nu e bun!" << endl;
    }
    
    return 0;
}

25. Spuneți de câte ori se apelează fiecare constructor în programul de mai jos și în ce ordine.

class cls1
{ 
protected: 
    int x;

public: 
    cls1() { x = 13; } 
};

class cls2: public cls1
{
protected:
    int y;

public: 
    cls2() { y = 15; }
};

class cls3: public cls2
{
protected:
    int z;

public:
    cls3() { z = 17; }
    int f(cls3 ob) { return ob.x + ob.y + ob.z; }
};

int main()
{
    cls3 ob;
    ob.f(ob);
    return 0;
}

26. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;
public: 
    cls() { x = 23; }
    int get_x(){ return x; }
};

int main()
{
    cls *p1, *p2;
    p1 = new cls;
    p2 = (cls*) malloc(sizeof(cls));
    int x = p1->get_x() + p2->get_x();
    cout << x;
    return 0;
}

27. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int a;
    B(int i=0) { a = i; }
    int get_a() { return a; }
};

class D: protected B
{
public: 
    D(int x=0): B(x) {}
    int get_a() { return B::get_a(); }
};

int main()
{
    D d(-89);
    cout << d.get_a();
    return 0;
}

28. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls1
{
public:
    int a;
    cls1() { a = 7; }
};

class cls2
{
public:
    int b;
    cls2(int i) { b = i; }
    cls2(cls1 &x) { b = x.a; }
};

int main()
{
    cls1 x;
    cout << x.a;
    cls2 y(x);
    cout << y.b;
    return 0;
}

29. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
public:
    int sa;
    cls(int s=0) { sa = s; }
    operator float() { return sa; }
};

int f(float c)
{ 
    return c * (1 + c/100);
}

int main()
{
    cls p(35);
    cout << f(p);
    return 0;
}

30. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
protected: 
    int x;

public:
    B() { x = 78; }
};

class D1: virtual public B
{
public:
    D1() { x = 15; }
};

class D2: virtual public B
{
public:
    D2() { x = 37; }
};

class C: public D2, public D1
{
public:
    int get_x() { return x; }
};

int main()
{
    C ob;
    cout << ob.get_x();
    return 0;
}

31. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

template <class tip>
class cls
{
    tip z;

public:
    cls(tip i) { z = i; }
    tip operator-(cls a) { return z - a.z; }
    int operator>=(cls a) { return z >= a.z; }
};

template <class tip>
tip dif(tip x, tip y)
{
    return x-y;
}

int dif(cls<int> x, cls<float> y)
{
    return x >= y ? x-y : y-x;
}

int main()
{
    cls<int> i = 3; cls<float> j = 4;
    cout << dif(i, j);
    return 0;
}

32. Spuneți de câte ori se apelează destructorul clasei cls în programul de mai jos. Justificați.

class cls
{
    int x;
public:
    cls(int i=0) { x = i; }
    cls(cls &ob) { x = ob.x; }
};

cls& f(cls &c)
{
    return c;
}

main()
{
    cls r;
    cls s = r;
    f(f(f(s)));
}

33. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int x;

public:
    B(int i=0) { x = i; }
};

class D: public B
{
public:
    D() : B(15) {}
    int f() { return x; }
};

int main()
{
    D d;
    cout << d.f();
    return 0;
}

34. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    static int i;
    int j;

public:
    cls(int x=7) { j = x; }
    static int imp(int k)
    {
        cls a; 
        return i + k + a.j;
    }
};

int cls::i;

int main()
{
    int k=5;
    cout << cls::imp(k);
    return 0;
}

35. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;

public:
    cls(int i=32) { x = i; }
    int f() const { return x++; }
};

void main()
{
    const cls d(-15);
    cout << d.f();
}

36. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează pentru o valoare întreagă citită egală cu 7, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

float f(int y)
{
    try
    {
        if (y % 2) throw y/2;
    }
    catch(int i)
    {
        if (i % 2) throw;
        cout << "Numarul " << i << " nu e bun!" <<endl;
    }
    return y/2;
}

int main()
{
    int x;
    try
    {
        cout << "Da-mi un numar intreg: ";
        cin >> x;
        if(x)
        {
            f(x);
        }
        cout << "Numarul " << x << " nu e bun!" << endl;
    }
    catch (int i)
    {
        cout << "Numarul " << i << " e bun!" << endl;
    }
    return 0;
}

37. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int x;

public:
    B(int i = 2) : x(i) {}
    int get_x() const { return x; }
};

class D: public B
{
    int *y;

public:
    D(int i = 2) : B(i)
    {
        y = new int[i];
        for(int j=0; j<i; j++)
            y[j] = 1;
    }

    D(D& a)
    {
        y= new int[a.get_x()];
        for(int i=0; i<a.get_x(); i++)
            y[i] = a[i];
    }

    int& operator[](int i) { return y[i]; }
};

ostream& operator<<(ostream& o, const D& a)
{
    for(int i=0; i<a.get_x(); i++) o << a[i];
    return o;
}

int main()
{
    D ob(5);
    cout << ob;
    return 0;
}

38. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int x;

public:
    B(int i = 10) { x = i; }
    int get_x() { return x; }
};

class D: public B
{
public:
    D(int i) : B(i) {}
    D operator+(const D& a) {return x + a.x; }
};

int main()
{
    D ob1(7), ob2(-12);
    cout << (ob1 + ob2).get_x();
    return 0;
}

39. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
public:
    int x;
    B(int i = 16) { x = i; }
    B f(B ob) { return x + ob.x; }
};

class D: public B
{
public:
    D(int i = 25) { x = i; }
    B f(B ob) { return x + ob.x + 1; }
    void afisare(){ cout << x; }
};

int main()
{
    B *p1 = new D, *p2 = new B, *p3 = new B(p1->f(*p2));
    cout << p3->x;
    return 0;
}

40. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int *v, nr;

public:
    cls(int i)
    {
        nr = i;
        v = new int[i];
        for(int j=1; j<nr; j++)
            v[j] = 0;
    }

    int size() { return nr; }
    int& operator[](int i) { return *(v+i); }
};

int main()
{
    cls x(10);
    x[4] = -15;
    for(int i=0; i<x.size(); i++)
        cout << x[i];
    return 0;
}

41. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;

public:
    cls(int i = -20) { x=i; }
    const int& f(){ return x; }
};

int main()
{
    cls a(14);
    int b=a.f()++;
    cout<<b;
    return 0;
}

42. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    static int x;
    int i;

public:
    B()
    {
        x++;
        i=1;
    }

    ~B() { x--; }
    static int get_x() { return x; }
    int get_i() { return i; }
};

int B::x;

class D: public B
{
public:
    D()  { x++; }
    ~D() { x--; }
};

int f(B *q)
{
    return q->get_i() + 1;
}

int main()
{
    B *p = new B;
    cout << f(p);
    delete p;
    p = new D;
    cout << f(p);
    delete p;
    cout << D::get_x();
    return 0;
}

43. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int x;

public:
    B(int i = 17) { x = i; }
    int get_x() { return x; }
    operator int() { return x; }
};

class D: public B
{
public:
    D(int i=-16):B(i) {}
};

int main()
{
    D a;
    cout << 27+a;
    return 0;
}

44. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    static int x;

public:
    cls (int i=1) { x = i; }
    cls f(cls a) { return x + a.x; }
    static int g() { return f()/2; }
};

int cls::x = 7;

int main()
{
    cls ob;
    cout << cls::g();
    return 0;
}

45. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int *v, nr;

public:
    cls(int i=0)
    {
        nr = i;
        v = new int[i];
        for (int j = 0; j < size(); j++)
            v[j] = 3 * j;
    }
    
    ~cls() { delete[] v; }
    int size() { return nr; }
    int& operator[](int i) { return v[i]; }
    cls operator+(cls);
};

cls cls::operator+(cls y)
{
    cls x(size());
    for (int i = 0; i < size(); i++)
        x[i] = v[i] + y[i];
    return x;
}
int main()
{
    cls x(10), y=x, z;
    x[3] = y[6] = -15;
    z = x + y;
    for(int i = 0; i < x.size(); i++)
        cout << z[i];
    return 0;
}

46. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class B
{
    int i;

public:
    B() { i = 1; }
    int get_i() { return i; }
};

class D: public B
{
    int j;

public:
    D() { j = 2; }
    int get_j() { return j; }
};

int main()
{
    B *p;
    int x=0;
    if(x) p = new B;
    else p = new D;
    if (typeid(p).name() == "D*")
        cout << ((D*) p)->get_j();
    return 0;
}

47. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class cls
{
    int x;

public:
    cls(int i) { x = i; }
    int set_x(int i)
    {
        int y = x;
        x = i;
        return y;
    }
    int get_x() { return x; }
};

int main()
{
    cls *p = new cls[10];
    int i=0;
    for(; i<10; i++)
        p[i].set_x(i);
    for(i=0; i<10; i++)
        cout << p[i].get_x(i);
    return 0;
}

48. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

template<class T>
int f(T x, T y)
{
    return x+y;
}

int f(int x, int y)
{
    return x-y;
}

int main()
{
    int a=5;
    float b=8.6;
    cout << f(a,b);
    return 0;
}

49. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
    int x;

public:
    A(int i=0) { x = i; }
    A operator+(const A& a) { return x + a.x; }
    
    template <class T>
    friend ostream& operator<<(ostream&,T);
};

template <class T>
ostream& operator<<(ostream& o, T t)
{
    o << t.x;
    return o;
}

int main()
{
    A a1(33), a2(-21);
    cout << a1+a2;
    return 0;
}

50. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
protected:
    int x;

public:
    A(int i=-31) { x = i; }
    virtual A operator+(A a) { return x + a.x; }
};

class B: public A
{
public:
    B(int i=12) { x = i; }
    B operator+(B b) { return x + b.x + 1; }
    void afisare(){ cout << x; }
};

int main()
{
    A *p1 = new B, *p2 = new A;
    B *p3 = new A(p2->operator+(*p1));
    p3->afisare();
    return 0;
}

51. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
    int x;
    static int y;

public:
    A(int i, int j) : x(i), y(j) {}
    int f() const;
};

int A::y;
int A::f() const { return y; }

int main()
{
    const A a(21,2);
    cout << a.f();
    return 0;
}

52. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
    int *v, dim;

public:
    A(int i)
    {
        dim = i;
        v = new int[dim];
        for(int j=0; j<dim; j++)
            v[j] = j;
    }

    A(A& a)
    {
        dim = a.dim;
        v = new int[dim];
        for(int j=0; j<dim; j++)
            v[j] = a.v[j];
    }

    ~A() { delete[] v; }
    int size() { return dim; }
    int& operator[](int i) { return v[i]; }
    A operator+(A a1);
};

A A::operator+(A a1)
{
    A a2(0);
    a2.dim = dim;
    v = new int[a2.dim];

    for(int j=0; j<a2.dim; j++)
        a2.v[j] = v[j] + a1.v[j];
    return a2;
}

ostream& operator<<(ostream& o, A a)
{
    for(int i=0; i<a.size(); i++)
        cout << a[i] << " ";
    return o;
}

int main()
{
    A a(10), b(10), c(10);
    c = a+b;
    cout << c;
    return 0;
}

53. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A;

class B
{
    int x;

public:
    B(int i=107) { x = i; }
    operator A();
};

B::operator A() { return x; }

class A
{
    int x;

public:
    A(int i=6) { x = i; }
    int get_x() { return x; }
};

int main()
{
    B b;
    A a = b;
    cout << a.get_x();
    return 0;
}

54. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>
class A
{
    int x;

public:
    A(int i=0) : x(i) {}
    int get_x() { return x; }
    int& set_x(int i) { x = i; }
};

A operator=(A a1, A a2)
{
    a1.set_x(a2.get_x());
    return a2;
}

int main()
{
    A a(212), b;
    cout << (b=a).get_x();
    return 0;
}

55. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
public:
    int x;
    A(int i=0) { x = i; }
    virtual A minus() { return 1-x; }
};

class B: public A
{
public:
    B(int i=0) { x = i; }
    void afisare() { cout << x; }
};

int main()
{
    A *p1 = new B(18);
    *p1 = p1->minus();
    p1->afisare();
    return 0;
}

56. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
    int x, *y;

public:
    A(int i)
    {
        x = i;
        y = new int[x];
    }

    A(A& a)
    {
        x = a.x;
        y = new int[x];
    }

    int get_x() const { return x; }
};

int f(A a) { return a.get_x(); }

int main()
{
    const A a(5);
    cout << (a.get_x() == f(a));
    return 0;
}

57. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
protected:
    int x;

public:
    A(int i=14) { x=i; }
};

class B: A
{
public:
    B(B& b) { x = b.x; }
    void afisare() { cout<<x; }
};

int main()
{
    B b1, b2(b1);
    b2.afisare();
    return 0;
}

58. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

class A
{
public:
    int x;
    A(int i=-13) { x = i; }
};

class B: virtual public A
{
public:
    B(int i=-15) { x = i; }
};

class C: virtual public A
{
public:
    C(int i=-17) { x = i; }
};

class D: virtual public A
{
public:
    D(int i=-19) { x = i; }
};

class E: public B, public C, public D
{
public:
    int y;
    E(int i, int j) : D(i), B(j) { y = x + i + j; }
    E(E& ob) { y = ob.x + ob.y; }
};

int main()
{
    E e1(-21,2), e2 = e1;
    cout << e2.y;
    char c;
    cin >> c;
    return 0;
}

59. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează pentru o valoare întreagă citită egală cu -35, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

int f(int y)
{
    if (y<0)
        throw y;
    return y/2;
}

int main()
{
    int x;
    try
    {
        cout << "Da-mi un numar par: ";
        cin >> x;
    
        if(x % 2)
            x = f(x);
        else
            throw x;
        cout << "Numarul " << x << " e bun!" << endl;
    }
    catch (int i)
    {
        cout << "Numarul " << i << " nu e bun!" << endl;
    }
    return 0;
}

60. Spuneți dacă programul de mai jos este corect. În caz afirmativ, spuneți ce afișează, în caz negativ spuneți de ce nu este corect.

#include <iostream.h>

template<class T>
T f(T x, T y)
{
    return x+y;
}

int f(int x, int y)
{
    return x-y;
}

int main()
{
    int *a = new int(3), *b = new int(23);
    cout << f(a,b);
    return 0;
}

Teorie

2005

1. Descrieți trei metode de proiectare diferite prin care elementele unei clase se pot regăsi în dublu exemplar, sub diverse forme, în definiția altei clase.
2. Spuneți ce este obiectul implicit al unei metode și descrieți pe scurt proprietățile pe care le cunoașteți despre acesta.
3. Descrieți pe scurt moștenirea virtuală și scopul în care este folosită.
4. Enumerați 3 metode de implementare a polimorfismului de compilare.
5. Descrieți pe scurt mecanismul de tratare a excepțiilor.
6. Descrieți pe scurt diferența dintre un pointer și o referință.

2006

7. Descrieți pe scurt diferența dintre funcțiile care returnează valoare și cele care returnează referință.
8. Descrieți pe scurt cum se pot defini funcții de conversie între tipuri (clase).
9. Spuneți care este diferența dintre clasa generică (template) și clasa abstractă și în ce situații se folosește fiecare dintre ele.
10. Descrieți pe scurt diferența dintre transferul prin valoare și transferul prin referință al parametrilor în cazul apelului unei funcții.
11. Spuneți pe scurt prin ce se caracterizează o metodă statică a unei clase.
12. Spuneți care este diferența dintre incluziunea de clase și moștenirea de clase și când se folosește fiecare metodă.

2007

13. Descrieți pe scurt constructorul de copiere și situațiile în care acesta este folosit.
14. Descrieți pe scurt ce reprezintă obiectul implicit al unei funcții.
15. Descrieți diferența dintre un pointer și o referință.
16. Descrieți pe scurt cum puteți prelua o dată prin incluziune și a doua oară prin moștenire o clasă numar într-o clasă lista care descrie liste nevide de dimensiune variabilă de elemente de tip numar.
17. Descrieți pe scurt metoda de identificare a tipului în timpul rulării (RTTI).
18. Spuneți dacă o variabilă constantă poate fi transmisă ca parametru al unei funcții și dacă da, în ce situații. Justificați.

2008

19. Spuneți ce reprezintă o funcție virtuală și în ce condiții o funcție virtuală definește o clasă abstractă.
20. Spuneți pe scurt prin ce se caracterizează un câmp static al unei clase.
21. Spuneți ce reprezintă o funcție prietenă (friend) a unei clase.
22. Spuneți dacă o variabilă constantă poate fi transmisă ca parametru al unei funcții și dacă da, în ce situații. Justificați.
23. Descrieți pe scurt ce reprezintă obiectul implicit al unei metode.
24. Descrieți pe scurt ce reguli verifică supraîncărcarea operatorilor.

2009

25. Descrieți pe scurt cum se comportă constructorii de copiere la moștenire.
26. Descrieți pe scurt operatorul typeid.
27. Spuneți ce este obiectul implicit al unei metode și descrieți pe scurt proprietățile pe care le cunoașteți despre acesta.
28. Descrieți pe scurt functiile virtuale și scopul în care sunt folosite.
29. Descrieți pe scurt funcțiile constante si dați un exemplu de utilizare.
30. Descrieți pe scurt diferența dintre un pointer și o referință.

Clone this wiki locally