class MyString
{
private:
char *mData;
size_t mLen;
void initData(const char *s)
{
mData = new char[mLen+1];
memcpy(mData, s, mLen);
mData[mLen] = '\0';
}
public:
MyString():mData(nullptr), mLen(0)
{
}
MyString(char *s): mLen(strlen(s))
{
initData(s);
}
MyString(const MyString& str):mLen(str.mLen)
{
initData(str.mData);
}
MyString(MyString&& str) noexcept
:mData(str.mData), mLen(str.mLen)
{
str.mLen=0;
str.mData= nullptr;
}
MyString& operator=(const MyString& str)
{
if(this!=&str)
{
if(mData) delete mData;
mLen = str.mLen;
initData(str.mData);
}
else
{
}
return *this;
}
MyString& operator=(MyString&& str) noexcept
{
if(this != &str)
{
if(mData) delete mData;
mLen = str.mLen;
mData = str.mData;
str.mLen = 0;
str.mData = nullptr;
}
return *this;
}
virtual ~MyString()
{
if(mData)
{
delete mData;
}
}
}
说明: MyString str; 1)如果没有实现移动构造,只实现了拷贝构造函数,使用MyString(std::move(str))时,std::move会失效,但是不会发生错误,因为编译器找不到移动构造,就去找拷贝构造函数,这也是拷贝构造中参数类型设置为const T&常量左值的原因; 2)c++11中的所有容器都实现了move语义,move只是转移了资源的控制权,本质上是将左值强制转换为右值使用,以用于移动拷贝或赋值,避免对含有资源的对象发生无畏的拷贝。
|