6.1. Přetěžování konstruktorů
| Časová náročnost: 12 minut |
Bez větších potíží lze
přetížit konstruktor třídy. Je to výhodné hned z několika důvodů.
- Získání větší flexibility
- Podpora polí
- Vytváření kopírovacích konstruktorů
Nejčastějším použitím přetíženého konstruktoru je zajištění možnosti voleb - zda inicializovat či ne.
V následujícím příkladu si uvedeme jak přetěžovat konstruktor. Všimněte si, že pokud odstraníme konstruktor s argumenty program se nepřeloží, protože mu bude tento konstruktor chybět. Jsou tedy nutné oba dva.
| Příklad 6.1. |
|
#include <iostream.h>
class myclass {
int x;
public:
myclass() { x = 0; } // konstruktor bez inicilizace
myclass(int n) { x = n; } // inicializovany konstruktor
int getx() { return x; }
};
int main()
{
myclass o1(10); // deklarace s pocatecni hodnotou
myclass o2; // deklarace bez pocatecni hodnoty
cout << "o1: " << o1.getx() << '\n';
cout << "o2: " << o2.getx() << '\n';
return 0;
}
|
Další důvod pro přetěžování konstruktorů je, aby se v programu mohly objevit jak samostatné objekty, tak i pole objektů.
| Příklad 6.2. |
|
#include <iostream.h>
class myclass {
int x;
public:
myclass() { x = 0; } // konstruktor bez inicializace
myclass(int n) { x = n; } // inicializovany konstruktor
int getx() { return x; }
};
int main()
{
// deklarace pole bez inicializace
myclass o1[10];
// declare pole s inicializaci
myclass o2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i;
for(i=0; i<10; i++) {
cout << "o1[" << i << "]: " << o1[i].getx();
cout << '\n';
cout << "o2[" << i << "]: " << o2[i].getx();
cout << '\n';
}
return 0;
}
|
Na závěr mějme situaci, kdy potřebujeme přetížit konstruktor třídy při alokování dynamického pole této třídy. Jak jsme si již dříve uvedli, dynamické pole nemůže být inicializováno. Proto, když třída obsahuje konstruktor, který přebírá inicializační prvek, musíme přidat přetíženy konstruktor, který
inicializační prvek nepřebírá.
| Příklad 6.3. |
|
#include <iostream.h>
class myclass {
int x;
public:
myclass() { x = 0; } // konstruktor bez inicializace
myclass(int n) { x = n; } // konstruktor s inicializaci
int getx() { return x; }
void setx(int n) { x = n; }
};
int main()
{
myclass *p;
myclass ob(10); // inicializace jednoduche promenne
p = new myclass[10]; // nelze pouzit inicializatory
if(!p) {
cout << "Chyba pri alokaci\n";
return 1;
}
int i;
for(i=0; i<10; i++) p[i] = ob;
for(i=0; i<10; i++) {
cout << "p[" << i << "]: " << p[i].getx();
cout << '\n';
}
return 0;
}
|