#include <iostream>
// move the new object instead of copying it.
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);
}
String(String&& other) noexcept
{
printf("Moved!\n");
m_Size = other.m_Size;
m_Data = other.m_Data;
//take care of the old data!!!
other.m_Data = nullptr;
other.m_Size = 0;
}
//friend std::ostream& operator<<(std::ostream& os, const String& string)
//{
// os << string.m_Data << std::endl;
// return os;
//}
//void PrintName(const String& name)
//{
// std::cout << name << std::endl;
//}
~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)
{
}
Entity(String&& name)
: m_Name((String&&)name)//or m_Name(std::move(name)), essentially does the same thing.
{
}
void PrintName()
{
m_Name.Print();
}
private:
String m_Name;
};
int main(void)
{
Entity entity("Groot");
entity.PrintName();
std::cin.get();
}
【Cherno的C++视频】Move semantics in C++
最新推荐文章于 2024-08-26 23:43:19 发布
本文介绍了C++中如何通过类String实现对象的移动构造函数,避免了复制带来的效率问题。通过`String&&`的使用,展示了如何在Entity类中利用移动构造创建更高效的对象。同时涉及内存管理,包括对象的创建、复制、移动和析构过程。
摘要由CSDN通过智能技术生成