Ve skutečnosti konstruktor nemusí být public, i když většinou tomu tak je.
Rozdíl mezi public a private je ten, že k private funkcím a oběktům nelze přistupovat jinde než v metodách dané třídy, naorzdíl od private metod, které se běžně volají i mimo tu danou třídu. Nejlépe to asi půjde vidět na příkladu.
Mějme třídu MyClass a metody fooPrivate a fooPublic
class MyClass
{
public:
MyClass(int number);
~MyClass() {};
int fooPublic();
void setNumber(int number);
private:
int number_m;
int fooPrivate();
};
MyClass::MyClass(int number)
{
// Lepší by bylo použít inicializační list, ale to je OT
number_m = number;
}
int MyClass::fooPrivate()
{
// K number_m se vztahují stejná pravidla jako k privátním funkcím - viz bod níže
return number_m * 10;
}
int MyClass::fooPublic()
{
// Zde volám privátní metodu třídy, ty lze volat jen uvnitř metod dané třídy,
// spřátelených funkcích a v některých případech dědičnosti
return fooPrivate() * 5;
}
int MyClass::setNumber(int number)
{
// number_m je privátní, tudíž nejde z venčí přímo nastavit,
// za použití setNumber(int) to ovšem už jde
number_m = number;
}
No... a teď k vysvětlení, mějme následující kód
MyClass object1(10); // object1 není ukazatel, jedná se o normální objekt proměnné MyClass
MyClass* object2 = new MyClass(10); // Vytvoření objektu tzv. na heapu, object2 je ukazatel
object1.setNumber(8);
object2->setNumber(8); // Je tedy vidět, že operátor -> se využívá u ukazatelů na objekt
int a = object1.fooPublic();
int b = object2->fooPublic();
// CO NELZE DĚLAT S PRIVÁTNÍMI METODAMI A PROMĚNNÝMI
int a = object1.number_m; // NELZE!
int a = object1.fooPrivate(); // NELZE!
int b = object2->number_m; // NELZE!
int b = object2->fooPrivate(); // NELZE!
object1.number_m = 5; // NELZE
object2->number_m = 5; // NELZE
// LZE - v tomto případě by to byl ekvivalent object1.number_m,
// ovšem jen pokud by number_m bylo v public sekci
object1.setNumber(5);
// LZE - v tomto případě by to byl ekvivalent object2->number_m,
// ovšem jen pokud by number_m bylo v public sekci
object2->setNumber(5)
Na co použít private a na co public už částečně shrnul KIIV. Jinak doporučuji konsultovat http://www.parashift.com/c++-faq-lite/