#include <iostream>
#include <cstring>
class String {
public:
String() = default;
String(const char* string) {
printf("Created\n");
m_Size = strlen(string);
m_Data = new char[m_Size];
memcpy(m_Data, string, m_Size);
}
String(const String& other) {
printf("Copied\n");
m_Size = other.m_Size;
m_Data = new char[m_Size];
memcpy(m_Data, other.m_Data, m_Size);
}
// Move constructor
String(String&& other) noexcept {
printf("Moved!\n");
m_Size = other.m_Size;
m_Data = other.m_Data;
// Create an hollow object
other.m_Size = 0;
other.m_Data = nullptr;
}
~String() {
printf("Destroyed\n");
delete m_Data;
}
void Print() {
for (uint32_t i = 0; i < m_Size; i++)
printf("%c", m_Data[i]);
printf("\n");
}
private:
char* m_Data;
uint32_t m_Size;
};
class Entity {
public:
Entity(const String& name) :
m_Name(name) {}
// Move constructor
Entity(String&& name) : m_Name(std::move(name)) {}
// Entity(String&& name) : m_Name((String&&)name) {}
void PrintName() {
m_Name.Print();
}
private:
String m_Name;
};
int main() {
Entity entity(String("Cherno"));
entity.PrintName();
std::cin.get();
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPGNzdHJpbmc+CgpjbGFzcyBTdHJpbmcgeyAKcHVibGljOiAKCVN0cmluZygpID0gZGVmYXVsdDsgCglTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nKSB7IAoJCXByaW50ZigiQ3JlYXRlZFxuIik7IAoJCW1fU2l6ZSA9IHN0cmxlbihzdHJpbmcpOyAKCQltX0RhdGEgPSBuZXcgY2hhclttX1NpemVdOyAKCQltZW1jcHkobV9EYXRhLCBzdHJpbmcsIG1fU2l6ZSk7IAoJfSAKCglTdHJpbmcoY29uc3QgU3RyaW5nJiBvdGhlcikgeyAKCQlwcmludGYoIkNvcGllZFxuIik7IAoJCW1fU2l6ZSA9IG90aGVyLm1fU2l6ZTsgCgkJbV9EYXRhID0gbmV3IGNoYXJbbV9TaXplXTsgCgkJbWVtY3B5KG1fRGF0YSwgb3RoZXIubV9EYXRhLCBtX1NpemUpOwoJfQoJCgkvLyBNb3ZlIGNvbnN0cnVjdG9yCglTdHJpbmcoU3RyaW5nJiYgb3RoZXIpIG5vZXhjZXB0IHsgCgkJcHJpbnRmKCJNb3ZlZCFcbiIpOyAKCQltX1NpemUgPSBvdGhlci5tX1NpemU7IAoJCW1fRGF0YSA9IG90aGVyLm1fRGF0YTsgCgkJCgkJLy8gQ3JlYXRlIGFuIGhvbGxvdyBvYmplY3QKCQlvdGhlci5tX1NpemUgPSAwOyAKCQlvdGhlci5tX0RhdGEgPSBudWxscHRyOyAKCX0KCQoJflN0cmluZygpIHsKCQlwcmludGYoIkRlc3Ryb3llZFxuIik7IAoJCWRlbGV0ZSBtX0RhdGE7IAoJfQoJCgl2b2lkIFByaW50KCkgeyAKCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9TaXplOyBpKyspCgkJCXByaW50ZigiJWMiLCBtX0RhdGFbaV0pOyAKCQlwcmludGYoIlxuIik7Cgl9CgkKcHJpdmF0ZTogCgljaGFyKiBtX0RhdGE7IAoJdWludDMyX3QgbV9TaXplOyAKfTsKCgpjbGFzcyBFbnRpdHkgewpwdWJsaWM6IAoJRW50aXR5KGNvbnN0IFN0cmluZyYgbmFtZSkgOiAKCQltX05hbWUobmFtZSkge30KCQoJLy8gTW92ZSBjb25zdHJ1Y3RvcgoJRW50aXR5KFN0cmluZyYmIG5hbWUpIDogbV9OYW1lKHN0ZDo6bW92ZShuYW1lKSkge30KCS8vIEVudGl0eShTdHJpbmcmJiBuYW1lKSA6IG1fTmFtZSgoU3RyaW5nJiYpbmFtZSkge30KCQoJdm9pZCBQcmludE5hbWUoKSB7IAoJCW1fTmFtZS5QcmludCgpOwoJfQoJCnByaXZhdGU6IAoJU3RyaW5nIG1fTmFtZTsgCn07IAoKaW50IG1haW4oKSB7IAoJRW50aXR5IGVudGl0eShTdHJpbmcoIkNoZXJubyIpKTsgCgllbnRpdHkuUHJpbnROYW1lKCk7IAoJCglzdGQ6OmNpbi5nZXQoKTsKfQo=