Es gibt keine Elementfunktion, die generell für jede Klasse sinnvoll ist. Als spezielle Objekteigenschaften sind denkbar:
Der Copy-Konstruktor und der Zuweisungsoperator
sind private zu deklarieren, ohne eine Definition anzugeben (Meyers 1991).
class Depot {
public:
// ...
private:
// Schnittstelle ohne Kopierfunktionen
Depot(const Depot&);
Depot& operator=(const Depot&);
// ...
};
Die Konstruktoren
werden nicht public deklariert. Objekte können - abgesehen von
Elementfunktionen und friends - nur mittels public
bereitgestellter static Elementfunktionen kreiert werden, die jeweils einen
Zeiger auf ein mit new auf dem Heap angelegtes Objekt zurückgeben
(ARM §12.2c und FAQ 311).
class X {
public:
static X* newX() { return new X; }
// ...
private:
X(); // Schnittstelle ohne public Konstruktor
// ...
};
void test() {
X* x = X::newX();
// ...
delete x;
}
Der gleiche Effekt läßt sich auch erzielen, indem der Destruktor private
deklariert wird (ARM §12.2c und Taligent 1994). Zum Löschen solcher Objekte, die
ausschließlich mit new kreiert werden können, kann eine public
Elementfunktion bereitgestellt werden.
class X {
public:
void deleteX() { delete this; }
// ...
private:
~X(); // Schnittstelle ohne public Destruktor
};
void test() {
X* x = new X;
// ...
x->deleteX();
}
Darüber hinaus sind noch weitere spezielle Eigenschaften möglich:
Der operator new
ist private zu deklarieren (Taligent 1994). Dann sollte auch operator
delete im private Teil stehen (Meyers 1996).
Die Konstruktoren werden private
deklariert. Eine friend-Funktion legt ein static Objekt an und
liefert bei jedem Aufruf eine Referenz auf dieses Objekt (vgl. Meyers 1996).
class X {
public:
friend X& gibX();
void f() { /* Beispiel fuer eine Elementfunktion */ }
// ...
private:
X(); // Schnittstelle ohne public Konstruktoren
X(const X&);
// ...
};
X& gibX() {
static X x;
return x;
}
void test() {
gibX().f();
}
Einen ähnlichen Ansatz schlagen Gamma et al. (1995) unter dem Namen "Singleton" vor.
Ein weiterer Spezialfall sind Klassen, von denen keine anderen Klassen abgeleitet
werden sollen. Sie werden Blattklassen ("Leaf-class") genannt (FAQ 433, Rumbaugh
und Booch 1995). Da solche Klassen nicht als Basisklassen fungieren, werden für sie keine
virtuellen Elementfunktionen und keine protected Elemente definiert.