转载:c++右值引用之转移构造函数_永不为辅的博客-CSDN博客_转移构造函数
上面那文章还不错,其他文章啰里啰唆的讲了一堆。
重点:
1.类内的this是地址,*this是值
移动构造就是将一块接下来不用的内存转给另一个用,其中无论原本是左值还是右值的变量都变成成右值,调用自己写的右值函数&&,实现内存重用。
using namespace std;
class MyString
{
private:
char* str;
size_t length;
void initString(const char *ch)
{
str = new char[length + 1]; //new 出来一块临时内存,给临时变量使用
memcpy(str, ch, length);
str[length] = '\0';
}
public:
MyString() :str(nullptr), length(0) {};
virtual ~MyString()
{
if (str) //如果不为空,说明临时new出来的变量还在,需要delete掉
delete str;
}
public:
MyString(const char* ch) //重载构造函数
{
length = strlen(ch);//strlen 获取字符的长度
initString(ch);
}
MyString(const MyString& ch) //拷贝构造函数
{
length = ch.length;
initString(ch.str);
}
MyString& operator=(const MyString& ch) //重载赋值操作符
{
cout << "ch address is:" << &ch.length << endl;
if (this!=&ch) //判断两个地址不相等
{
length = ch.length;
initString(ch.str);
}
return *this;
}
MyString(MyString&& ch) //移动构造函数 不能有const,因为要改变它的值
{
length = ch.length;
str = ch.str;
ch.length = 0; //让临时变量为空
ch.str = nullptr; //直接去掉临时变量
}
MyString& operator=(MyString&& ch) //重载操作符
{
if (this !=&ch)
{
length = ch.length;
str = ch.str;
ch.length = 0; //让临时变量为空
ch.str = nullptr; //直接去掉临时变量
}
return *this;
}
};
int main(int argc, char* argv[])
{
MyString temp("test"); //拷贝构造
MyString str;
str = temp;
MyString test(move(temp)); //移动构造
return 0;
}