Page 1 of 1

[C++] La ce sunt bune referintele constante?

Posted: 30 Jul 2007, 22:07
by Marius Bancila
Intrebare: La ce sunt bune referintele constante?

Raspuns: Folosirea unei referinte constante la apelul unei functii care nu are nevoie sau nu trebuie sa modifice argumentul evita crearea unui obiect temporar, ceea ce poate duce la cresterea preformantei (mai ales atunci cand numarul apelurilor este foarte mare).

Fie clasa

Code: Select all

class foo
{
public:
  foo() {std::cout << "default constructor" << std::endl;}
  foo(const foo& rhs) {std::cout << "copy constructor" << std::endl;}
};
Programul de mai jos

Code: Select all

void func(foo f)
{
  std::cout << "func" << std::endl;
}

int main()
{
  foo f1;
  func(f1);
}
afiseaza
default constructor
copy constructor
func
ceea ce indica ca un al doile obiect foo a fost creat in momentul apelului.

Pe de alta parte, programul urmator

Code: Select all

void func(foo& f)
{
  std::cout << "func" << std::endl;
}

int main()
{
  foo f1;
  func(f1);
}
va afisa doar
default constructor
func
Un al doilea obiect foo, temporar, nu mai este creat.

In cazul de mai sus, functia func nu modifica obiectul pasat prin referinta, si in plus nici nu ar trebui sa-l modifice. Pentru a preveni acest lucru, si a creste const-correctness se recomanda ca aceasta referinta sa fie constanta. Cu alte cuvinte functia ar trebui sa arate astfel:

Code: Select all

void func(const foo& f)
{
  std::cout << "func" << std::endl;
}
In acest caz incercarea de a modifica obiectul f va rezulta intr-o eroare de compilare.

Pasarea de referinte (constante sau nu) la tipurile built-in (char, int, short, long, float, double, bool) nu imbunatateste perfomanta. Acestea pot fi pasate prin valoare.


Next FAQ >>