6.1. Přetěžování konstruktorů

Časová náročnost
Č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ů.

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.

src/6_1.cpp
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ů.

src/6_2.cpp
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á.

src/6_3.cpp
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;
}