dyna/string1a.cpp

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 ********************************