Constructors, Destructors, and Scoping

First example:

#include <cstdio>
#include <string>

using namespace std;

class Test
{
public:
    Test();
    Test(string name);
    ~Test();

private:
    string name;
};

Test::Test()
{
    name = "Unknown";
    printf("%s got created\n", name.c_str());
}

Test::Test(string new_name)
{
    name = new_name;
    printf("%s got created\n", name.c_str());
}

Test::~Test()
{
    printf("%s got destroyed\n", name.c_str());
}

int
main()
{
    Test test("\"function level\"");

    printf("Hello World!\n");

    Test *ptr_test = new Test("Pointer");
    delete ptr_test;

    for (int i = 0; i < 5; ++i) {
        Test loop_test("\"loop level\"");
        printf("%d\n", i);
    }
    
    return 0;
}

Second example:

#include <cstdio>
#include <cstring>

class SillyString
{
public:
    SillyString();
    SillyString(char *str);
    ~SillyString();

    char *c_str();

private:
    char *data;
};

SillyString::SillyString()
{
    data = NULL;
}

char *
SillyString::c_str()
{
    if (data == NULL) {
        return "";
    } else {
        return data;
    }
}

SillyString::SillyString(char *str)
{
    if (str == NULL) {
        data = NULL;
    } else {
        size_t len = strlen(str);
        data = new char[len + 1];
        strcpy(data, str);
    }
}

SillyString::~SillyString()
{
    delete data;
}

int
main()
{
    SillyString *str = new SillyString("Hi, my name is Faith");
    SillyString str1(str->c_str());
    delete str;

    printf("%s.\n", str1.c_str());

    return 0;
}