Illustrates all of the basic parts of a class, e.g., Constructors, operators, destructor, and member data.
ClassAnatomy.cpp
#include "TestClass.h"
#include "..\Helpers\Helpers.h"
#include <iostream>
#include <string>
#include <vector>
#include <memory>
//----< default constructor >----------------------------------------------
Test::Test()
{
std::cout << "\n void construction of \"Test\"";
name_ = "Test";
}
//----< promotion constructor >--------------------------------------------
Test::Test(const std::string& name)
{
name_ = name;
std::cout << "\n named construction of \"" << name_ << "\"";
}
//----< reset instance name string >---------------------------------------
std::string rename(const std::string& prefix, const std::string& sourceName)
{
if (prefix != sourceName.substr(0, 4))
return prefix + " of " + sourceName;
else
return sourceName;
}
//----< copy constructor >-------------------------------------------------
Test::Test(const Test& t) : name_(t.name_)
{
std::cout << "\n copy of \"" << name_ << "\"";
name_ = rename("copy", t.name_);
}
//----< move constructor >-------------------------------------------------
Test::Test(Test&& t) : name_(std::move(t.name_))
{
std::cout << "\n move of \"" << name_ << "\"";
t.name_ = "been moved"; // copies chars, so inefficient, but shows how move works
name_ = rename("move", t.name_);
}
//----< copy assignment operator >-----------------------------------------
Test& Test::operator=(const Test& t)
{
std::cout << "\n copy assignment of \"" << name_ << "\"";
if (this != &t)
{
name_ = rename("copy", std::move(t.name_));
}
return *this;
}
//----< move assignment operator >-----------------------------------------
Test& Test::operator=(Test&& t)
{
if (this != &t)
{
name_ = rename("move", std::move(t.name_));
t.name_ = "been moved"; // copys chars, so inefficient, but shows how move works
std::cout << "\n move assignment of \"" << name_ << "\"";
}
return *this;
}
//----< destructor >-------------------------------------------------------
Test::~Test()
{
std::cout << "\n destruction of \"" << name_ << "\"";
}
//----< name "property" >--------------------------------------------------
std::string& Test::name()
{
return name_;
}
//----< enunciator >-------------------------------------------------------
void Test::say()
{
std::cout << "\n my name is \"" << name_ << "\"";
}