Das folgende Code-Beispiel stammt aus dem Buch
Objektorientiertes Programmieren in C++
- Ein Tutorial für Ein- und Umsteiger
von Nicolai Josuttis, Addison-Wesley München, 2001
© Copyright Nicolai Josuttis 2001
// Headerdatei der eigenen Klasse
#include "string.hpp"
// C-Headerdateien für String-Funktionen
#include <cstring>
#include <cctype>
// **** BEGINN Namespace Bsp ********************************
namespace Bsp {
/* Konstruktor aus C-String (const char*)
* - Default für s: ""
*/
String::String (const char* s)
{
len = std::strlen(s); // Anzahl an Zeichen
size = len; // Zeichenanzahl bestimmt Speicherplatzgröße
buffer = new char[size]; // Speicherplatz anlegen
std::memcpy(buffer,s,len); // Zeichen in Speicherplatz kopieren
}
/* Copy-Konstruktor
*/
String::String (const String& s)
{
len = s.len; // Anzahl an Zeichen übernehmen
size = len; // Zeichenanzahl bestimmt Speicherplatzgröße
buffer = new char[size]; // Speicherplatz anlegen
std::memcpy(buffer,s.buffer,len); // Zeichen kopieren
}
/* Destruktor
*/
String::~String ()
{
// mit new[] angelegten Speicherplatz wieder freigeben
delete [] buffer;
}
/* Operator =
* - Zuweisung
*/
String& String::operator= (const String& s)
{
// Zuweisung eines Strings an sich selbst hat keinen Effekt
if (this == &s) {
return *this; // String zurückliefern
}
len = s.len; // Anzahl an Zeichen übernehmen
// falls Platz nicht reicht, vergrößern
if (size < len) {
delete [] buffer; // alten Speicherplatz freigeben
size = len; // Zeichenanzahl bestimmt neue Größe
buffer = new char[size]; // Speicherplatz anlegen
}
std::memcpy(buffer,s.buffer,len); // Zeichen kopieren
return *this; // geänderten String zurückliefern
}
/* Operator ==
* - vergleicht zwei Strings
* - globale Friend-Funktion, damit eine automatische
* Typumwandlung des ersten Operanden möglich ist
*/
bool operator== (const String& s1, const String& s2)
{
return s1.len == s2.len &&
std::memcmp(s1.buffer,s2.buffer,s1.len) == 0;
}
/* Operator +
* - hängt zwei Strings hintereinander
* - globale Friend-Funktion, damit eine automatische
* Typumwandlung des ersten Operanden möglich ist
*/
String operator+ (const String& s1, const String& s2)
{
// Puffer für den Summenstring erzeugen
char* buffer = new char[s1.len+s2.len];
// Summenzeichenfolge darin initialisieren
std::memcpy (buffer, s1.buffer, s1.len);
std::memcpy (buffer+s1.len, s2.buffer, s2.len);
// daraus Summenstring erzeugen und zurückliefern
return String (s1.len+s2.len, buffer);
}
/* Konstruktor für uninitialisierten String bestimmter Länge
* - intern für Operator +
*/
String::String (unsigned l, char* buf)
{
len = l; // Anzahl an Zeichen übernehmen
size = len; // ist gleichzeitig auch Speicherplatzgröße
buffer = buf; // Speicherplatz übernehmen
}
/* Ausgabe auf Stream
*/
void String::printOn (std::ostream& strm) const
{
// Zeichenfolge einfach ausgeben
strm.write(buffer,len);
}
} // **** ENDE Namespace Bsp ********************************