TESTE GRILA 2

. ex.41

class X{

public:

X( ){}

X(X x){}

};

void main( )

{

X ox;

}

a)clasa X are doi constructori corecti unul de clasa,altul de copiere

b)cei doi constructori ai clasei X genereaza ambiguitate

c)constructorul de copiere este eronat, acceptat in aceasta forma ar produce recursivitate infinita

d)constructorul de copiere poate primi obiectul sursa prin valoare

d)constructorul de copiere poate primi obiectul sursa doar in forma:const X &x;

raspuns:

c)constructorul de copiere este eronat, acceptat in aceasta forama ar produce recursivitate infinita

Constructorul de copiere trebuie sa primeasca obiectul sursa prin referinta.


ex.42.

#include<iostream.h>

class cls {

public:

int x ;

friend void f(cls &c) {}

};

void main ( )

{const cls c ; f(c) ; }

a)f()nu poate fi apelata cu referinta de obiect constant daca nu declara si ea referinta constanta

b)f()este corect apelata deoarece nu modifica obiectul c;

c)f()este incorect definita in interiorul unei clase ;

d)f()este incorect apelata deoarece nu se precizeaza obiectul care a apelat-o;

e)f()este eronat definita deoarece atributul friend nu se aplica decat claselor ;

raspuns:

a)f()nu poate fi apelata cu referinta de obiect constant daca nu declara si ea referinta constanta

sub forma:

friend void f(const cls &c) {}


ex43 Se va compila corect urmatoarea clasa ?

class num{

public:

int data ;

num(int i) {data=i;}

int set (int i){data=i;}

int set(int i) const {return data=i;}

};

raspuns :NU .

Functia set( )este declarata const pt.a modifica valoarea variabilei data ceea ce nu e corect


ex44 Se va compila corect urmatoarea clasa ?

class num{

public:

int data ;

num(int i) {data=i;}

int set (int i){data=i;}

int set(int i) {return data=i;}

int val( ) const {return set(25);}

};

raspuns :NU.

Functiile membre const nu pot apela functii membre neconstante ale clasei .

Functiile membre const pot apela alte functii membre const.


ex.45 Daca transformam membrii statici in constanti ca mai jos este bine sa plasam declararea(nu definirea) membrilor statici intr-un fisier header ?

class cursor{

public:

static const int xactiv,yactiv;

int x,y;

cursor(int xi,int yi);

};

const int cursor ::xactiv=23;

const int cursor::yactiv=99;

raspuns:DA

Declaratiile membrilor constanti statici pot fi plasate intr-un fisier header la fel ca orice declaratie de constante .


ex.46 .Se da clasa :

class c{

double a,b;

public:

friend c operator +(c &,double );

friend c operator +(double ,c &);

};

operator + se supraincarca in doua moduri deoarece:

a)se permite in acest fel comutativitatea operatiei de adunare intre un obiect si un double

b)exista doi operatori in limbaj unul unar (de semn)si altul binar pt.adunare

c)se permite astfel asociativitatea operatiei de adunare a obiectelor

d)operatia este eronata deoarece se folosesc functii friend

e)descrierea este eronata doarece se fol.in aceste cazuri doar metode statice

raspuns:

a)se permite in acest fel comutativitatea operatiei de adunare intre un obiect si un double ;

Singura modalitate o reprezinta in acest caz functiile friend operator.In acest fel putem face operatii comutative :obiect cu tip de baza dar si tip de baza cu obiect .


ex.47

#include<iostream.h>

class C {

public:

int x;

C(int v) : x(v) {}

};

//functii independente

double operator+(C &c,double d) {return c.x +d;}

double operator +(double d ,C &c) {return c.x +d ;}

void main( )

{

C c(5);

cout<<2+c+3;

}

a)supraincarcarile operator+( ) trebuiau declarate friend in clasa C

b)adunarea obiectelor cu double este comutativa

c)programul afiseaza 10;

d)supraincarcarile operator+( ) nu se justifica deoarece au acelasi cod ;

e)adunarea obiectelor cu double nu este asociativa (supraincarcarile trebuiau sa returneze referinte )

raspuns:

c)programul afiseaza 10;

Deoarece metodele care supraincarca operatorul + nu acceseaza partea privata a clasei C ele nu trebuie sa fie declarate friend ;functiile sunt corect definite .

Se observa ca functiile pt.supraincarcare nu sunt membre a clasei C,sunt independente .


ex.48.

#include<iostream.h>

class persoana {

int varsta;

int salar;

friend ostream&operator<<(ostream &out,persoana p)

{out<<p.varsta<<" "<<p.salar; return out;}

public:

persoana (int v) : varsta(v),salar(0) { }

persoana ( ):varsta(0),salar(0){}

};

void main ( )

{persoana p=1; cout <<p; }

a)afiseaza 1 0 b)afiseaza 0 0 c)contine erori de compilare d)afiseaza 1 1

e)afiseaza 0 1

raspuns :

a)afiseaza 1 0

Se mai poate scrie asa persoana p(1) in loc de persoana p=1; si apeleaza constructorul cu un parametru care initializeza obiectul .


ex.49 Fiind data clasa : class ex {int a,b,c; public: int operator .( );};

Functia realizeaza supraincarcarea operatorului " ." ?

a)da ,deoarece returneaza un int si exista o data de tip int in cadrul obiectului;

b)nu,deoarece operatorul . se supraincarca numai printr-o functie friend;

c)nu,deoarece nu exista o variabila de tip struct in obiect

d)nu,deoarece operatorul . nu poate fi supraincarcat

e)da ,respecta regulile de supraincarcare a operatorilor;

raspuns:

d)nu,deoarece operatorul . nu poate fi supraincarcat


ex50 Este folosit supraincarcarea operatorului [ ] in exemplul urmator ?

char titlu [80];

raspuns :NU .Parantezele drepte nu sunt utilizate ca operator ci pt.a specifica dimensiunea vectorului .


ex.51 .Fie clasa :

class v{

int v[50],nr_c; //vectorul si nr.de componente

public:

int &operator[ ](int i){return i>0 && i<nr_c ? v[i] : v[nr_c-1];}

};

Supraincarcarea operatorului [ ] realizeaza :

a)modificarea valorii elementului

b)determinarea valorii elementului

c)modificarea si determinarea valorii elementului

d)o definire eronata ,deoarece returneza o referinta

e)o alta operatie dacat cele propuse

raspuns:

c)modificarea si determinarea valorii elementului

Returnand o referinta la o zona de memorie se permite atat modificarea cat si determinarea continutului ei.


..ex52.

class vector{

public:

double x[10];

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

}v;

Care combinatie de adresari sunt corecte ?

v[4]=4; cout<<v[4]; //varianta 1

v.x[4]=100; cout<<v.x[4]; //varianta 2

v[4].x[4]=100; cout<<v[4].x[4]; //varianta 3

a)doar 1 si 2 b)doar 1 c)doar 2 d)toate e)doar 2 si 3

raspuns:

a)doar 1 si 2

In varianta 1 se apeleaza supraincarcarea operatorului [ ]In varianta 2 se califica membrul public x care este de tip masiv dupa care se acceseaza o componenta .Var.a 3-a este incorecta .


ex.53.In clasa :

class M {

int v[50][50],nr_lin ,nr_col;

public:

int &operator[ ](int i,int j){

return i>0 && i< nr_lin && j<nr_col ? v[i][j] : v[nr_col-1][nr_lin-1] ;

}

};

Supraincarcarea operatorului [] este corecta ?

a)da; b)nu,metoda nu accepta doi parametrii c)nu deoarece metoda returneza o referinta

d)nu,deoarece trebuie definita ca functie friend e)nu,deoarece metoda trebuie definita static

raspuns:

b)nu,metoda nu accepta doi parametrii


ex.54

#include<iostream.h>

class matrice {

public:

int a[2][2];

int *operator [] (int i){return a[i];}

matrice ( ){a[0][0]=99;a[0][1]=500;a[1][0]=400;a[1][1]=110;}

};

void main ()

{

matrice m;

cout<<m[1][1]<<endl; //afiseaza 110 (1)

cout<<m.a[0][0]<<endl; //afiseaza 99 (2)

cout<<m.operator [](1)[0]; //afiseaza 400 (3)

}

Care variante afiseaza corect elementele din matricea bidimensionala ?

a)toate b)1+2 c)1 d)2 e)2+3

raspuns :

a)toate


ex.55

class ex{

int a;

public: friend istream &operator>>(istream &,ex &); };

Functia realiz.supraincarcarea operatorului binar >>?

a)da,pt.implementarea operatiei de deplasare la dreapta

b)da,in scopul citirii datelor obiectului de la tastatura;

c)da ,in scopul afisarii datelor obiectului

d)nu,operatorul >>nu se poate supradefini;

e)nu,neavand suficienti parametrii.

raspuns:

b)da,in scopul citirii datelor obiectului de la tastatura;


ex.56

#include<iostream.h>

class persoana{

int varsta;

public:

persoana (int v=18) : varsta(v){}

operator int( ) {return varsta;}

persoana &operator++( )

{

varsta++ ;

return *this;

}

persoana operator++(int)

{

persoana aux=*this ;//salveaza starea initiala a obiectului

//sau mai poate fi scris asa persoana aux(*this);

varsta++ ;

return aux;

}

};

void main ( )

{

persoana p(20);

int x=p++; //val.va fi 20+1

int y=++p; //val va fi 21+1

cout<<x<<endl<<y<<endl; //va afisa 20 22

}


ex.57 Care dintre urmatorii operatori sunt legali?

  1. complex operator+(complex a,complex b)
  2. void ceas:: operator++( )
  3. char *operator+(char *a ,char *b)
  4. void operator @ (menu bar1, menu bar2)
  5. menu operator ++(menu a ,menu b)
  6. void sir:: operator +=(char *s)

raspuns:

a.CORECT deoarece functia are un numar corespunzator de argumente pt.op.binar + si cel putin un astfel de argument este obiect ;

b.CORECT,deoarece op.++ este unar iar functia este membra ,in cazul functiei operator unar prefixat lista argumetelor este vida ;

c.ILEGAL,pt. ca din lista de argumente lipseste cel de tip obiect

d.ILEGAL,operatorul nu este implementat in limbajul C++

e.ILEGAL,operatorul ++este unar ,functia nu este membra si deci trebuie ori sa posede un singur argument ,ori al doilea argument sa fie int pentru a semnala forma postfixata a operatorului.

f.CORECT,functia operator += fiind membra va accepta un singur argument explicit (poate fi si referinta) care nu va fi obiect. (obiectul este considerat pointerul this fiind primul )


ex.58 .Posibilitatea definirii unui obiect ca fiind o extensie a altui obiect este :

a)data de incapsulare b)data de mostenire

c)data de polimorfism d)data de existenta claselor virtuale e)nepermisa

raspuns :

b)data de mostenire

un obiect derivat mosteneste toate atributele si metodele obictului de baza ;in plus el poate adapta metodele mostenite ,poate aduce noi metode si caracteristici aparand deci ca o extensie a obictului de baza .


ex.59 Fie clasa D derivata public din clasa B .In acest caz o metoda publica din clasa D poate accesa o data din sectiunea privata a clasei B ?

a)da,in orice conditii b)da,dar fara a modifica valoarea

c)da,doar daca metoda se defineste inline d) nu

e)nu este permisa derivarea publica a unei clase dintr-o alta clasa

raspuns:

d)nu

Zona privata a clasei de baza este inaccesibila direct din clasa derivata ,dar poate fi accesata indirect cu functii de acces public sau protected mostenite .


ex.60

.versiunea 1:

#include<iostream.h>

class persoana{

private:

int varsta;

public:

persoana(int v=20):varsta(v){}

int spune_varsta(){return varsta;}

};

class muncitor: public persoana{

public:

int f(){return spune_varsta();}

};

void main()

{

persoana p1;

cout<<p1.spune_varsta(); //20

persoana p2(50);

cout<<p1.spune_varsta() //50

muncitor m1;

cout<<m1.f(); //20

}

versiunea 2:

#include<iostream.h>

class persoana{

public:

persoana(int v=20):varsta(v){}

protected:

int varsta;

int spune_varsta(){return varsta;}

};

class muncitor: public persoana{

public:

int f(){return spune_varsta();}

};

void main()

{

muncitor m1;

cout<<m1.f(); //20

}

Functia f( ) din clasa muncitor are acces pe zona privata din clasa de baza ?

a)da,doar printr-o metoda protected mostenita

b)da,dar fara sa–i modifice valoarea

c)da,dar prin metode public sau protected mostenite (vezi versiunile)

d)nu

e)da,doar printr-o metoda public mostenita

raspuns:

c)da,dar prin metode public sau protected mostenite (vezi versiunile)

Zona privata a clasei de baza poate fi accesata indirect cu functii de acces public sau protected mostenite .


ex61.

#include<iostream.h>

class c1{int a;};

class c2 :public c1{

public:

int b;

void scrie_a( ){cout<<"a="<<a<<endl;}

};

void main()

{ c2 ob; ob.scrie_a( ); }

a)functia scrie_a( ) nu are acces asupra unui membru privat

b)prg.afiseaza valoarea lui a ;

c)functia de acces are doar acces read-only asupra unui membru privat

d)derivarea publica este incorect realizata

e)prin derivare publica ,accesul la membrii mosteniti devine public

raspuns:

a)functia scrie_a( ) nu are acces asupra unui membru privat

Membrul a al clasei c1 este implicit privat;neexistand nici o functie de acces el nu este nici direct nici indirect accesibil ;


ex.62

class c1{ /*…..*/};

class c2 :public c1{ /*……*/};

Clasa c2 fata de c1 este :

a)derivata b)de baza c)friend d)virtuala

e)declarata eronat in loc de semnul : trebuia pus operatorul de rezolutie ::

raspuns:

a)derivata


ex.63.

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

class cd : public cb {int b; public: cd( ){b=a+3;}};

declaratia : void main(){cd od;} determina ca variabila b sa ia valoarea 10?

a)da ,deoarece mai intai se executa constructorul bazei si apoi cel al clasei derivate

b)nu ,deoarece mai intai se executa constructorul clasei derivate si apoi cel al clasei de baza

raspuns :

a)da ,deoarece mai intai se executa constructorul bazei si apoi cel al clasei derivate


ex.64 Fie clasa CD care mosteneste clasa CB ,ambele clase avand cate un destructor .Sa se precizeze in cazul definirii unui obiect de tipul CD care destructor se va executa primul.

a)al clasei CD

b)al clasei care are mai multi constructori

c)se va perciza in program in mod obligatoriu altfel rezulta eroare

d)nu exista un criteriu precis ,acest lucru se face aleator

raspuns :

a)al clasei CD


ex.65 In ipoteza ca exista clasele de baza B1,B2,B3 si B4 declaratia :

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

a)incorecta,neexistand derivare de tip protected

b)incorecta pt.ca la B4 nu se specifica tipul derivarii

c)perfect valida ;

d)incompleta deoarece D nu are constructori

e)incompleta deoarece D nu are metode specifice

raspuns :

c)perfect valida


.ex.66

Se da urmatoarea ierarhie :

#include<iostream.h>

class B { };

class D1:B{};

class D2:B{};

class M1:D1,public D2{ };

class M2 : virtual D1 , virtual public D2{ }; //atentie

void main()

{

}

Care afirmatii sunt corecte :

1)clasa M1 va mosteni un obiect de tip B

2)clasa M1 va mosteni doua obiecte de tip B

3)clasa M2 va mosteni un obiect de tip B

4)clasa M2 va mosteni doua obiecte de tip B

a)2+3 b)1+2 c)2+4 d)1+3 e)1+4

raspuns:

a)2+3


ex.67

#include<iostream.h>

class B1{int x;};

class B2{int y;};

class B3{int z;};

class B4{int t;};

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

void main()

{

D d;

cout<<d.m; // (1)

cout<<d.x; //(2)

cout<<d.y; //(3)

cout<<d.z; //(4)

cout<<d.t; //(5)

Variantele care permit accesul la variabile pentru afisare sunt:

a)1+2+4+5 b)1+2 c)1+2+4 d)1 e)1+2+5

raspuns :

d)1(numai varianta 1)


ex.68.Un instrument performant prin care se realizeaza polimorfismul este:

a)functiile friend b)functiile inline c)constructorii d)functiile virtuale e)destructorii

raspuns:

d)functiile virtuale

Polimorfismul se realizeaza prin doua mecanisme : prin supraincarcarea functiilor sau operatorilor ,si prin virtualizare .Constructorii ca orice functie pot fi supraincarcati dar ei nu stau la baza realizarii polimorfismului.


ex.69

class c{int a;

public :

virtual void metoda1( )=0;

virtual void metoda2( int )=0;

};

void main ( )

{

c *pob; //(1)

c ob; //(2)

c *vpob[5]; //(3)

c vob[5]; //(4)

};

Declaratiile admise in acest caz sunt:

a)1+2+3 b)1+2 c)1+3 d)2+4 e)1+2+3+4

raspuns :

c)1+3 Pentru o clasa abstracta nu se pot defini obiecte dar se pot declara pointeri la obiecte ,deci si masive de pointeri .


ex.70.

class c{int a;

public:

virtual void metoda1( )=0;

virtual void metoda2(int )=0;

};

a)este o clasa virtuala b)este o clasa incompleta c)este o clasa abstracta

d)realizeaza incorect definirea functiilor virtuale e)este o clasa pura

raspuns :

c)este o clasa abstracta


ex.71.Clasele care permit parametrizarea tipurilor de date asociate unei variabile membru sunt numite :

a)virtuale b)friend c) template d)derivate e)complexe

raspuns:

c)template

Sunt asa numitele sabloane de clase sau clase template


ex.72.

template<class INTEGER,int k>

class A { INTEGER v[k]; };

Sablonul clasei A:

a)parametrizeaza tipul elementelor masivului v;

b)parametrizeaza tipul elementelor masivului v si numarul de elemente

c)paramatrizeaza numarul de elemente a masivului v

d)este incorect definit deoarece tipul INTEGER nu exista in limbajul C

e)este incorect definit deoarece sabloanele de clase nu parametrizeaza decat tipuri de data si nu variabile

raspuns:

b)parametrizeaza tipul elementelor masivului v si numarul de elemente

Sabloanele de clasa pot descrie clase parametrice atat la nivelul tipurilor de data pentru unele date membre cat si la nivelul unor constante folosite in cadrul clasei .


ex.73.In prg:

#include<iostream.h>

struct test{

int x;

public:int y;

private: int z;

protected : int v;

} t ;

void main( ){cout<<t.v; cout<<t.x;}

a)variabila membru x este inaccesibila

b)variabila membru v (si z ) este inaccesibila

c)structurile nu pot contine domenii de acces

d) structurile nu pot contine domeniul de acces protected

e)prg.este corect in totalitate

raspuns:

b)variabila membru v este inaccesibila

Ca si clasele, membrii private sau protected dintr-o structura sunt inaccesibili direct din exterior .Spre deosebire de clase structurile au membrii impliciti publici.


ex.74 Se da :

int *pi;

float *pf;

pi=pf;

atribuirea este corecta in C++ ?

a) da b)nu

raspuns:

b)nu In C++ se poate atribui un pointer altuia doar daca cei doi sunt de acelasi tip.


ex.75 Este valid acest prg.in C++ :

#include<iostream.h>

void f( ) ;

main( )

{

f( );

return 0;

}

void f( )

{

class X{

int i;

public:

void pune_i(int n){i=n;}

int da_i( ){return i;}

}ob1;

ob1.pune_i(99);

cout<<ob1.da_i( );

}

a)nu b)da

raspuns:

b)da O clasa poate fi definita in interiorul unei functii fiind cunoscuta doar acelei functii si necunoscuta in afara ei.

 


Proiect realizat de MARTON (POP) CLAUDIA an IV Ianuarie 2005