#include <iostream>

struct TestClass
{
    TestClass()
    {
        std::cout << "Instance has been constructed" << std::endl;
    }
    TestClass(const TestClass &from)
    {
        std::cout << "Copy has been constructed" << std::endl;
    }
    TestClass &operator=(const TestClass &from)
    {
        std::cout << "Assignment" << std::endl;
    }
    ~TestClass()
    {
        std::cout << "Instance has been destructed" << std::endl;
    }
};

void Do1(TestClass t)
{
}
void Do2(TestClass &t)
{
}

int main()
{
    std::cout << "Start of main" << std::endl;
    TestClass test;
    std::cout << "Do1:" << std::endl;
    Do1(test);
    std::cout << "Do2:" << std::endl;
    Do2(test);
    std::cout << "End of main" << std::endl;
}