Ppoo
Ppoo
int main(){
B b, *pb;
D d, *pd;
pb=&b;
pb->st(); // static method st() of B
pb->v(); // virtual method v() of B
pb=&d;
pb->st(); // static method st() of B
pb->v(); // virtual method v() of D
return 0;
}
4. 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 :
a. 3 2 0 1 (fara &)
b. 3 2 0 0 (cu &)
c. 3 3 1 2 (cu &)
5. Fie urmatorul program, in care se utilizeaza clase abstracte:
// abselem.h
#ifndef ABSTRACTELEM_H
#define ABSTRACTELEM_H
class AbstractElem{
public:
virtual void display()=0;
virtual void process()=0;
};
#endif
//fifo.h
#ifndef FIFO_H
#define FIFO_H
#include "abselem.h"
class Fifo{
public:
Fifo(int nrmax=0);
void put(AbstractElem *);
AbstractElem* get();
void remove();
private:
int nrmax;
int nrelem;
int first;
int free;
AbstractElem* *support;
};
#endif
//elements.h
#include "abselem.h"
#include "iostream.h"
class Person: public AbstractElem{
public:
Person(char *name);
virtual void display();
virtual void process();
private:
char *name;
};
class Car: public AbstractElem{
public:
Car(char *name);
virtual void display();
virtual void process();
private:
char *name;
};
//driver.cpp
#include "elements.h"
#include "fifo.h"
Fifo queue(3);
void main(){
queue.put(new Person("Tudor"));
queue.put(new Person("Andrei"));
queue.put(new Car("B-39-TDR"));
queue.get()->process(); queue.remove();
queue.get()->process(); queue.remove();
queue.get()->process(); queue.remove();
}
//fifo.cpp //sau LIST.cpp
#include "fifo.h"
Fifo::Fifo(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new AbstractElem* [nrmax-1];
}
void Fifo::put(AbstractElem * pe){
support[free]=pe; free= ++free % nrmax; nrelem++;
}
AbstractElem* Fifo::get(){
return support[first];
}
void Fifo::remove(){
first= ++first % nrmax;
--nrelem;
}
//elements.cpp
#include "elements.h"
Person::Person(char *name):name(name){};
void Person::display(){cout<<name<<endl;}
void Person::process(){
cout<<"A Person: ";
display();
}
Car::Car(char *name):name(name){};
void Car::display(){cout<<name<<endl;}
void Car::process(){
cout<<"A Car:";
display();
}
Programul afiseaza datele in ordinea:
a. Tudor Andrei B-39-TDR
6. Fie urmatorul program, in care se utilizeaza clase abstracte:
#include "iostream.h"
template <class T>
class Fifo{
public:
Fifo(int nrmax=0);
void put(T);
T get();
void remove();
private:
int nrmax;
int nrelem;
int first;
int free;
T* support;
};
template <class T>Fifo<T>::Fifo(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new T [nrmax-1];
}
template <class T> void Fifo<T>::put(T e){
support[free]=e; free= ++free % nrmax; nrelem++;
}
template <class T> T Fifo<T>::get(){
return support[first];
}
template <class T> void Fifo<T>::remove(){
first= ++first % nrmax;
--nrelem;
}
class Person {
public:
Person(char *name);
Person(); //necesar pentru a intializa tablouri
virtual void display();
virtual void process();
private:
char *name;
};
class Car {
public:
Car(char *name);
Car();
virtual void display();
virtual void process();
private:
char *name;
};
Person::Person(char *name):name(name){};
Person::Person(){};
void Person::display(){cout<<name<<endl;}
void Person::process(){
cout<<"A Person: ";
display();
}
Car::Car(char *name):name(name){};
Car::Car(){};
void Car::display(){cout<<name<<endl;}
void Car::process(){
cout<<"A Car:";
display();
}
Fifo<Person> queuePerson(3);
Fifo<Car> queueCar(3);
void main(){
[u]queuePerson.put(Person("Andrei"));
queuePerson.put(Person("Tudor"));
queueCar.put(Car("B-39-TDR"));[/u]
queuePerson.get().process(); queuePerson.remove();
queueCar.get().process(); queueCar.remove();
queuePerson.get().process(); queuePerson.remove();
}
Programul afiseaza:
A Person: Andrei
A Car:B-39-TDR
A Person: Tudor
7. Fie programul:
// singleton
// constructor private
#include <iostream.h>
#include <conio.h>
class S{
public:
static S* create()
{
if(i==0){
refS=new S(); i++;
}
return refS;
}
void setName(char *s){name=s;}
char* getName(){return name;}
static int getNr(){return nr;}
private:
static S* refS;
static int i;
static int nr;
S(){nr++;}
char *name;
};
int S::i=0;
int S::nr=0;
S* S::refS=0;
void main(){
S *o1, *o2;
o1=S::create();
o2=S::create();
o1->setName("Matematica");
o2->setName("Informatica");
cout<<o1->getName()<<endl;
cout<<o2->getName()<<endl;
cout<<S::getNr()<<endl;
getch();
}
Programul afiseaza:
a. Matematica Informatica 1
b. Informatica Informatica 1
c. Informatica Informatica 2
d. Matematica Informatica 2
8. Fie programul:
// destructor static,
#include <iostream.h>
class B{
public:
~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
~D(){cout<<"~D()"<<endl;}
};
void main(){
clrscr();//<conio.h>
B *pb;
D *pd;
pd= new D();
pb=new D();
delete pb;
delete pd;
}
Programul afiseaza :
~ B() ~D() ~B()
9. Fie programul:
// destructor static
#include <iostream.h>
#include <conio.h>
class B{
public:
B(){cout<<"B()"<<endl;}
~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
D(){cout<<"D()"<<endl;}
~D(){cout<<"~D()"<<endl;}
};
void main(){
clrscr();
B *b=new B(); //apel D()
delete b;
b=new D(); //apel B(), D()
delete b;
}
Programul afiseaza :
B() ~B() B() D() ~B()
10. Fie programul :
// destructor virtual,
#include <iostream.h>
class B{
public:
virtual ~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
virtual ~D(){cout<<"~D()"<<endl;}
};
void main(){
B *pb;
D *pd;
pd= new D();
pb=new D();
//pd = new B(); //error "Cannot convert 'B*' to 'D*' in function main()"
delete pb;
delete pd;
}
Programul afiseaza:
~ D()~B()~D() ~B()
11. Fie programul :
// constructor de copiere in clasa de baza; dar absent in clasa derivata
// compilatorul creeaza un constructor de copiere implicit
// care apeleaza constr de copiere al clasei de baza pentru copierea atributelor din clasa de
baza
// si copiaza membru cu membru atributele din D
#include <iostream.h>
class B{
public:
B(){cout<<"B()"<<endl;}
B(B &b){cout<<"B(B &b)"<<endl;}
};
class D: public B{
public:
D(){cout<<"D()"<<endl;}
};
void main(){
B b; // apel B() // B()
B b1(b); // apel B(B & ); nu se mai utilizeaza B()! //B(B&b)
D d; // apel B();D() // B() D()
D d1(d); // B(B &b)
B bd(d); // conversie implicita la clasa de baza; // B(B &b)
getch();
}
B() B(B &b) B() D() B(B &b) B(B &b)
Programul afiseaza
10 25
14. Fie urmatorul program:
// Constructor cu semantica prin referinta
// Operatorul = este cel implicit
#include <iostream.h>
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);
a[0]=-100;
cout<<(x=y)<<endl;
}
Programul afiseaza:
10 20
15.Fie urmatorul program C++, în care operatorul de insertie << este supraîncarcat.
Operatorul de atribuire = este cel predefinit, cu semantica prin referinta.
#include <iostream.h>
class C{
public:
C(int n, 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= new int[dim];
for(int j=0; j<dim; j++){pi[j]=v[j];}
}
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);
cout<<(x=y)<<endl;
y.set(0,1000);
cout<<x<<endl;
}
Care din afirmatiile urmatoare sunt adevarate:
Programul afiseaza:
10 20
1000 20
16. Fie urmatorul program C++, în care operatorul de insertie << si operatorul de
atribuire = sunt supraîncarcati. Prin supraîncarcare, operatorul de atribuire are semantica
prin valoare (el înlocuieste pe cel predefinit, care are semantica prin referinta).
Rersursele obiectului destinatie d din expresia d=s sunt eliberate chiar si în cazul de
autoatribure d=d.
#include <iostream.h>
class C{
public:
C(int n, int v[]);
void set(int i, int val){pi[i]=val;}
C& operator=(C&);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= new int[dim];
for(int j=0; j<dim; j++){pi[j]=v[j];}
}
// supraincarcare cu semantica prin valoare
C& C::operator=(C& x){
private:
char *name;
static long nr;
};
long Person::nr=0;
void f(){Person *p =
new Person("Balanescu");
delete p;
}
void main(){
while(1)f();
}
Care afirmatie este adevarata:
Programul afiseaza un sir finit de numere 1 2 3 4...etc. pana memoria este epuizata
21.Fie urmatorul program C++:
#include <string.h>
#include <iostream.h>
class Person{
public:
Person(char *p){
name=new char[strlen(p)+1];
strcpy(name,p);
}
~Person(){delete[] name;}
private:
char *name;
};
void f(){
// obiect nou, alocare dinamica in memoria heap
Person *p =new Person("Balanescu");
delete p;
}
void main(){
while(1)f();
}
Care din afirmatiile urmatoare sunt adevarate:
Programul nu se termina, deoarece conditia de continuare din instructiunea while
este mereu îndeplinita
22.Fie programul:
//destructor explicit
#include <string.h>
#include <iostream.h>
class Person{
public:
Person(char *p){name=new char[strlen(p)+1]; strcpy(name,p);}
~Person(){delete[] name;}
private:
char *name;
};
void f(){Person *p =
new Person("Balanescu");
delete p;
// fara aceasta instructiune, obiectele se acumuleaza
// in heap si blocheaza executarea, spre deosebire de Java
}
void main(){
while(1)f();
}
Care din afirmatiile urmatoare sunt adevarate:
La iesirea din functia f(), spatiul alocat pentru sirul de caractere “Balanescu” este eliberat
23. Fie urmatorul program:
#include <iostream.h>
class A{
public:
};
Constructorul Persoana(char *) poate fi utilizat pentru:
Conversia sirurilor de caractere in obiecte Persoana
26. 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 ¿
27. 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 obiect punct in obiect complex
28. 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(AbstractElem*ae){};
virtual AbstractElem*get(){};
virtual int isEmpty(){};
virtual int isFull(){};
};
#endif;
Care afirmatie este corecta:
AbstractList este o clasa abstracta
29. Fie urmatorul program:
#include <iostream.h>
class A{
public:
// supraincaracre void s()
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int)"<<endl; }
// supraincarcare void v()
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;}
};
void main(){
A *pa;
B b;
pa=&b; pa->s(); pa->v(1);
}