I made a mistake in class when I said that C++ uses the copy
constructor for the case obj1 = obj2. It does not. You have
to explicitly overload the assignment operator. We will discuss this in
the next class.
#include <cstdio>
#include <cstring>
class SillyString
{
public:
    SillyString();
    SillyString(const char *str);
    SillyString(const SillyString& other);
    ~SillyString();
    SillyString& operator = (const SillyString& other);
    size_t length() const;
    const char *c_str() const;
private:
    char *data;
};
SillyString::SillyString()
{
    data = NULL;
}
const char *
SillyString::c_str() const
{
    if (data == NULL) {
        return "";
    } else {
        return data;
    }
}
size_t
SillyString::length() const
{
    return strlen(data);
}
SillyString::SillyString(const char *str)
{
    if (str == NULL) {
        data = NULL;
    } else {
        size_t len = strlen(str);
        data = new char[len + 1];
        strcpy(data, str);
    }
}
SillyString::SillyString(const SillyString& other)
{
    if (other.data == NULL) {
        data = NULL;
    } else {
        size_t len = other.length();
        data = new char[len + 1];
        strcpy(data, other.data);
    }
}
SillyString&
SillyString::operator = (const SillyString& other)
{
    delete[] data;
    if (other.data == NULL) {
        data = NULL;
    } else {
        size_t len = other.length();
        data = new char[len + 1];
        strcpy(data, other.data);
    }
    return *this;
}
SillyString::~SillyString()
{
    delete[] data;
}
int
main()
{
    SillyString *str = new SillyString("Hi, my name is Faith");
    SillyString str2(*str);
    delete str;
    str2 = "No it isn't";
    printf("%s.\n", str2.c_str());
    return 0;
}