Sunteți pe pagina 1din 13

C++ supports reference variables -> see question 1

1. How do you check whether a linked list is circular?

Intr-o lista circular vor fi mereu doi pointeri care duc spre acelasi nod. O solutie ar fi
parcurgerea listei si verificarea daca la fiecare nod se pointeaza de doia ori. O alta solutie a I
parcurgerea listei si sse verifica daca un nod a fos parcurs de doua ori. O solutie optima este
folosirea a doi pointeri de salturi diferite care incep cu capul listei. Daca pointerul cu salt mai
mare ajunge este null, lista e aciclica. Daca pointerul cu salt mai mare este egal cu pointerul
de salt mai mic SAU urmatorul element pointat de pointerul cu salt mai mare este egal cu
pointerul de salt mic, atunci lista e ciclica.
2. How do you decide which integer type to use?
Daca e nevoie de valori mari (peste 32.767 sau -32767) se foloseste long. Daca
dimensiunea e importanta (adica sunt arrayuri mari sau structuri) se foloseste short int
(memorare pe un byte), altfel int (4 bytes), long int(8 bytes).
3. How do you differentiate between a constructor and destructor?
Constructorul este folosit pentrua initializa un obiect. Poate avea argumente.
Supraincarcarea este posibilia, insemnand ca pot exista mai multi constructori definiti
intr-o clasa.Are acelasi nume ca si clasa. Avem: constructor implicit, constructor cu
parametric, constructor de copiere. Se mai folosesc pentru alocarea dinamica a
memoriei folosind operatorul new.
Destructorul este folosit pentru a distruge un obiect creat anterior. Nu primeste
argumente. Supraincarcarea nu este posibila. Are acelasi nume ca si clasa cu
operatorul ~ in fata. Este folosit pentu eliberarea zonei de memorie alocata.
Foloseste indirect operatorul delete pentru a distruge un obiect.
4. How do you differentiate between aggregation and association?
Asocierea - relatie in care toate obiectele au propriul lor ciclu de viata si nu depend intre
ele. Ex. Profesor Elev. Mai multi studenti pot fi asociati unui singur professor sau un singur
student poate fi asociat mai multor profesori.
public class Foo {
void Baz(Bar bar) {
}
};

Agregarea o e forma de asociere unde toate obiectele au propriul ciclu de viata, dar exista si
dependente intre ele. Catedra si professor. Un professor nu poate apartine mai multor
catedre. Stergerea obiectului catedra nu implica si distrugerea obiectului professor.
public class Foo {
private Bar bar = new Bar();
}
Compunerea este o forma de agregare mai puternica. Obiectele copil nu au popriul ciclu de
viata. Daca obiectul parinte este sters, se sterge si obiectul copil (referinta). Exemplu. Casa
cu obiectul camera. O casa poate avea mai multe camere. Daca stergem obiectul casa, se
vor sterge.
public class Foo {
private Bar bar;
Foo(Bar bar) {
this.bar = bar;
}
}
5. How do you find out the size of a class?
Sizeof membri nonstatici. Ordinea membrilor influenteaza, existenta functiilor.
6. How do you implement an itoa function?

// Implementation of itoa()
char* itoa(int num, char* str, int base)
{
int i = 0;
bool isNegative = false;
/* Handle 0 explicitely, otherwise empty string is printed for 0 */
if (num == 0)
{
str[i++] = '0';
str[i] = '\0';
return str;
}
// In standard itoa(), negative numbers are handled only with
// base 10. Otherwise numbers are considered unsigned.
if (num < 0 && base == 10)
{
isNegative = true;
num = -num;
}
// Process individual digits

while (num != 0)
{
int rem = num % base;
str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
num = num/base;
}
// If number is negative, append '-'
if (isNegative)
str[i++] = '-';
str[i] = '\0'; // Append string terminator
// Reverse the string
reverse(str, i);
}

return str;

7. How do you initialize a pointer to a function?

Sintaxa de definire a pointerilor la funcii este asemntoare cu sintaxa de definire a funciilor. n forma general, o
funcie se declar astfel:
tip_returnat nume_functie(lista parametri);
Un pointer la funcie se declar dup sintaxa:
tip_returnat (*nume_variabila_pointer)(lista_parametri);
Practic numele funciei se nlocuiete cu construcia (*nume_pointer).
8. How do you link a C++ program to C functions?

extern "C" void foo( );

9. How do you return a structure from functions?


struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
struct MyObj a = foo();

10. How do you write a function that can reverse a linked-list?


void recursiveReverse(struct node** head_ref)
{
struct node* first;
struct node* rest;
/* empty list */
if (*head_ref == NULL)
return;
/* suppose first = {1, 2, 3}, rest = {2, 3} */
first = *head_ref;
rest = first->next;
/* List has only one node */
if (rest == NULL)
return;
/* reverse the rest list and put the first element at the end */
recursiveReverse(&rest);
first->next->next = first;
/* tricky step -- see the diagram */
first->next = NULL;
/* fix the head pointer */
*head_ref = rest;
}
11. What are the benefits of using exceptions in C++?
Avantaje nu trebuie sa verific eroarea la fiecare apel esuat. Nu pot fi evitate. Vor opri
aplicatia la un anumit punct al executiei. Fac codul sa fie mai simplu si mai curat sic el mai
putin probabil sa evite erori. Separa codul normal de codul pentru gestionarea erorilor. Cand
o exceptie este aruncata, toate obiectele din blocul try vor fi distruse inainte de prinderea
erorii.
12. What are the differences between a struct and a class in C++?
The only difference between a class and a struct in C++ is that structs have default public
members and bases and classes have default private members and bases. Both classes and
structs can have a mixture of public and private members, can use inheritance, and can
have member functions. Structs are simple data containers, while classes are used for objects that
need to act on the data in addition to just holding on to it.
13. What are the different types of Storage classes?
A storage class defines the scope (visibility) and life-time of variables and/or functions within a C++
Program.

auto

register

static

extern

mutable

The auto Storage Class


The auto storage class is the default storage class for all local variables.
The register Storage Class

The register storage class is used to define local variables that should be stored in a register instead of
RAM. This means that the variable has a maximum size equal to the register size (usually one word) and
can't have the unary '&' operator applied to it (as it does not have a memory location).

The static Storage Class

The static storage class instructs the compiler to keep a local variable in existence during the life-time of
the program instead of creating and destroying it each time it comes into and goes out of scope.
Therefore, making local variables static allows them to maintain their values between function calls.
The static modifier may also be applied to global variables. When this is done, it causes that variable's
scope to be restricted to the file in which it is declared.
In C++, when static is used on a class data member, it causes only one copy of that member to be shared
by all objects of its class.
The extern Storage Class

The extern storage class is used to give a reference of a global variable that is visible to ALL the program
files. When you use 'extern' the variable cannot be initialized as all it does is point the variable name at a
storage location that has been previously defined.

The mutable Storage Class

The mutable specifier applies only to class objects, which are discussed later in this tutorial. It allows a
member of an object to override constness. That is, a mutable member can be modified by a const
member function.

14. What do you mean by inline function?


O tehnica utila pentru a mari performanta programelor ce folosesc multe functii de foarte
mici dimensiuni, pentru care regia de apel este semnificativa n raport cu timpul de executie
al functiei propriu-zise, este folosirea functiilor inline. Functiile declarate ca inline vor fi
expandate in-line la compilare, compilatorul genernd codul corespunzator functiei n pozitia
apelului, n loc de a genera secventa de apel. Pentru a indica faptul ca o functie este de
acest tip, se precede declaratia sau definitia ei cu cuvntul cheie inline.

15. What does extern mean in a function declaration?


extern is significant only with data declarations. In function declarations, it can be used as a
stylistic hint to indicate that the function's definition is probably in another source file, but
there is no formal difference between
16. What does it mean to declare a function or variable as static?
Static duration means that the object or variable is allocated when the program starts and is
deallocated when the program ends. The static keyword can be used to declare variables,
functions, class data members and class functions.

17. What is a conversion constructor?

A converting constructor is a single-parameter constructor that is declared without the function


specifier explicit. The compiler usesconverting constructors to convert objects from the type of the first
parameter to the type of the converting constructor's class

18. What is a conversion constructor?


Constructor, cu un singur parametru, care face posibila conversia implicita de la tipul
unui argument la tipul constructorului (de la tip de data la tip obiect). De exemplu
conversie de la int la ClasaMea. Constructorul de copier poate f considerat
constructor de conversie. Daca se foloseste cuvantul explicit nu mai este posibila
conversia MyClass = 1 din moment ce e conversie implicita
19. What is a copy constructor?
Constructorul de copier e un constructor special pentru crearea unui obiect ca o copie a unui
obiect existent. Primeste ca parametru referinta la un alt obiect de acelasi tip ca al celui ce
urmeaza sa fie construit, urmat de parametri de orice tip, avand valori default. Daca nu
exista, compilatorul creaza unul pentru fiecare clasa (numit constructor implicit de copiere).
Este folosit in general cand un obiect are pointeri. Parametrul (const sau volatile) este o
referinta de acelasi tip. Constructorul de copiere e folosit numai pentru instantieri.
20. What is a namespace?
Un namespace e folosit pentru structurarea unui program in unitati logice. Ex: pot avea
doua clase cu acelasi nume dar in namespace-uri diferite pentru a evita un conflict.
21. What is a pure virtual function?
O functie pur virtuala este o functie care la declarare este egala cu 0. =0 se refera la
specificatorul pur, asta face ca o functie pur virtuala sa fie pura. Poate fi implementata. O
clasa care are cel putin o metoda pur virtuala se numeste clasa abstracta
22. What is a scope resolution operator?
Operatorul de rezolutie ajuta la identificarea componentelor unei clase. Se foloseste in cazul
in care am o variabila si o variabila globala cu acelasi nume. Variabila locala are prioritate.
Se mai foloseste pentru definirea functiilor in afara clasei.
23. What is abstraction?
Se refera la gruparea datelor si a metodelor. Separa interfata de implementare. Ex tv, poate
fi pornit sau oprit, pot fi schimbate canalele fara a sti detaliile interioare, ce se intampla in
spate.

24. What is difference between #define and const?


Ambele pot fi folosite cu acelasi scop dar actioneaza diferit. Cand se foloseste #define,
identificatorul e cu valoarea mentionata inainte ca, codul sa fie transformat in binary. Pe de
alta parte cand se foloseste const si aplicatia ruleaza, memorie este alocata pentru
constanta si valoarea este inlocuita la rulare.
25. What is difference between function overloading and overriding?
Supraincarcarea unei metode sau a unei functii in c++ se refera la definirea mai multor
functii cu acelasi nume atata timp cat au set diferit de parametric.. Suprascrierea unei
metode se refera la abilitatea unei clase mostenite de a rescrie sau adauga cod in metoda
virtuala din clasa de baza.
26. What is encapsulation?
Proprietate a obiectelor de a-si ascunde o parte din date si metode. Numai datele si
metodele publice sunt accesibile in afara obiectului. Mareste siguranta si fiabilitatea
programelor prin eliminarea posibilitatii modificarii accidentale a valorilor. Partea vizibila a
obiectului o constituie interfata.
27. What is function overloading?
Definirea mai multor metode cu acelasi nume dar cu parametric diferiti.
28. What is multiple inheritance?
Derivarea din mai multe clase se numeste derivare multipla.
Exemplu:
Clasa Profesor derivate din clasele Persoana si Angajat.
#include <string>
class Person
{
private:
std::string m_strName;
int m_nAge;
bool m_bIsMale;
public:
Person(std::string strName, int nAge, bool bIsMale)
: m_strName(strName), m_nAge(nAge), m_bIsMale(bIsMale)
{
}

std::string GetName() { return m_strName; }


int GetAge() { return m_nAge; }
bool IsMale() { return m_bIsMale; }
};
class Employee
{
private:
std::string m_strEmployer;
double m_dWage;
public:
Employee(std::string strEmployer, double dWage)
: m_strEmployer(strEmployer), m_dWage(dWage)
{
}
std::string GetEmployer() { return m_strEmployer; }
double GetWage() { return m_dWage; }
};
// Teacher publicly inherits Person and Employee
class Teacher: public Person, public Employee
{
private:
int m_nTeachesGrade;
public:
Teacher(std::string strName, int nAge, bool bIsMale, std::string strEmployer, double dWage, int
nTeachesGrade)
:
Person(strName,
nAge,
bIsMale),
Employee(strEmployer,
dWage),
m_nTeachesGrade(nTeachesGrade)
{
}
};

Mostenirea multipla poate cauza probleme. Se considera clasa AdaptorWireless derivata din
UsbDevice si NetworkDevice, amvele clase avand metoda GetId. Se ceaza un nou obiect de
tip AdaptorWireless. cout << c54G.GetID(); nu stie care functie sa o apeleze.
cout << c54G.USBDevice::GetID(); obiectul AdaptorWireless contine doua functii GetID
care trebuiesc separate.

29. What is operator overloading?


E un caz specific de polimorfism in care unii operatori sunt tratati ca functii cu
comportament diferit.
30. What is partial specialization or template specialization?
In general se scrie o clasa template ce serveste ca sablon pentru multe late clase de
acelasi tip. Folosind template specializaiton, se suprascrie implementarea de baza a clasei

template pentru tipuri particulare. Partial template specialization se refera la implementarea


partiala a unei clase template ce permite parametrizari.
31. What is polymorphism?
Proprietatea de a lua mai multe forme. Este de mai multe forme: parametric -> definirea
unei metode cu numar variabil de parametri, polimorfismul de mostenire -> metoda din
clasa de baza e redefinita in clasa mostenita cu aceeasi parametric (selectia functiei se face
la rulare). Implementarea se face cu functiile virtuale. Polimorfismul ad hoc -> aka
supraincarcarea metodelor
32. What is the difference between passing by value and passing by reference?
La transferal prin valoare se face automat o copie locala in interiorul functiei. La transferal
prin referinta se da o referinta directa catre variabila transferata. In modul asta lucreaza si
constructorul de copiere.
33. What is the difference between an object and a class?
Clasa - tip de date ce combina variaible si metode intr-o singura unitate. Obiectul este o
instanta a unei clase sau o variabila a unei clase.
34. What is the difference between declaration and definition?
La declarare se anunta practice un tip de date, fie ca e tip, obiect sau functie. La definire se
face implementarea propriu zisa.
Ex: la declararea variablelor se face implicit si definirea lor. Folosind extern pe o variabila,
aceasta se declara doar, nu se defineste:
extern int x;
int func()
{
x = 3;
}

35. What is the difference between delete and delete[]?


Delete[] se foloseste in cazul array-urilor dinamice alocare cu new[]. Delete[] se apeleaza
pentru fiecare element al unui array. Delete se folosest in cazul in care exista o singura
instanta.
Ex: delete this->element element = un char

Delete[] this->nume = nume = string, vector de char[]


36. What is the difference between inner class and abstract class?
Clasa inner este declarata in intregime in interiorul unei alte clase sau interfete. Se mai
numeste si subclasa. Snut folosite pentru ascunderea unor detalii la implementare. De ex.
Clasa lista care contine ca membru privat clasa nod. Clasa nod nu poate fi accesata ca
membru al unei instante de tip lista.
37. What is the difference between persistent & non-persistent objects?
Un obiect persistent poate exista chiar si dup ace aplicatia care l-a creat a incetat sa mai
ruleze.
38. What is the difference between structure and union?
La structuri se foloseste cuvantul cheie struct. Cand se defineste o variabila de tipul
structurii, se aloca zona de memorie pentru fiecare membru, zona de memorie fiind unica
pentru fiecare membru. Modificarea valorii unui membru nu implicca schimbarea celorlalti.
In cazul union se foloseste cuvanutl cheie union, alocarea zonei de memorie se face pentru
membrul care va ocupa cel mai mult deci memoria ocupata de union este egala cu a
membrului. Schimband valoarea unui membru se schimba toti ceilalti membri. Adresa e
aceeasi pentru fiecare membru. Numai un membru poate fi accesat la timp.
39. What is the difference between the deep copy and shallow copy?
Shallow copy c++ copiaza fiecare membru individual folosind operatorul =. E util in cazul
claselor simple. Un obiect b pointeaza catre adresa de memorie a obiectului a. daca a se
sterge, se sterge si b, din moment ce duce catre aceeasi zona de memorie.
Deep copy se copiaza fiecare element din zonele de memorie ale lui a, in zonele de
memorie ale elementelor lui b. daca se sterge a, b ramane intact
40. What is the difference between the private public and protected members?
Private accesibil doar in interiorul clasei in care este declarat
Public - accesibil in toate instantele, inclusiv in clasele derivate
Protected accesibil in clasa inc are a fost declarat precum si in clasele derivate
41. What is the maximum size that an array can hold?
Nu exista limita exacta. E determinata de hardware.
42. What is the most efficient way to reverse a linked-list?

Iterative:
void reverse(Node*& head) {
if (!head) return;
Node* prev = NULL;
Node* curr = head;
while (curr) {
Node* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head = prev;
}

Recursive
void reverse(Node*& p) {
if (!p) return;
Node* rest = p->next;
if (!rest) return;
reverse(rest);
p->next->next = p;
p->next = NULL;
p = rest;
}

43. What is the size of an empty class?


Orice clasa goala are dimensiunea 1. Compilatorul adauga automat 1 byte
structurilor si claselor care nu au membri pentru a avea dimensiunea 1 in loc de 0
44. What is the use of virtual destructor?
Daca in in clasa derivate, destructorul este virtual, la apel se sterge mai intai obiectul
derivat, apoi cel de baza. In caz ca destructorul nu e virtual in clasa derivata, la apel se va
sterge obiectul de baza acesta fiind un pointer la tipul clasei de baza.
45. What is virtual class and friend class?
Clasele friend sunt folosite cand una sau mai multe clase sunt destinate sa lucreze impreuna
si au nevoie de acces la iplementarea fiecareia intr-un alt mod decat cel obisnuit. Sunt
folosite pentruaccesul la membri privati ai unei clase. Clasele virtuale sunt folosite pentru
usurinta in derivarea multipla.

46. Whats the best way to declare and define global variables?
Se declara in afara claselor sau in afara blocurilor. se poate declara si in alte fisiere si se
foloseste extern pentru acces.

47. Where is memory for class-object allocated? What about struct?


Heap both

S-ar putea să vă placă și