C++11 右值引用(2)
程序员文章站
2022-03-22 20:56:18
...
先参考上一节 C++11 右值引用(1),本节是右值引用的第一个用途:减少拷贝,减低开销,提高效率。
C++11的右值引用概念出来后,C++类的默认函数多了两个,移动构造和移动赋值函数。(之前的所有默认函数为:构造、析构、拷贝构造、拷贝赋值、取址、取址const)。
下面是一个简单例子。
class MyString
{
public:
MyString()
{
data_ = NULL;
length_ = 0;
cout << "default constructor " << endl;
}
MyString(char* data, int length)
{
data_ = new char[length];
length_ = length;
memcpy(data_, data, length_);
cout << "constructor " << endl;
}
MyString(const MyString& str)
{
data_ = new char[str.length_];
length_ = str.length_;
memcpy(data_, str.data_, length_);
cout << "copy constructor " << endl;
}
MyString& operator=(const MyString& str)
{
if (this != &str)
{
data_ = new char[str.length_];
length_ = str.length_;
memcpy(data_, str.data_, length_);
}
cout << "copy assignment " << endl;
}
~MyString()
{
if (NULL != data_)
{
delete[] data_;
data_ = NULL;
}
cout << "destructor" << endl;
}
// 移动构造
MyString(MyString&& str)
{
data_ = new char[str.length_];
length_ = str.length_;
memcpy(data_, str.data_, length_);
str.data_ = NULL;
str.length_ = 0;
cout << "move constructor " << endl;
}
// 移动赋值
MyString& operator=(MyString&& str)
{
if (this != &str)
{
data_ = new char[str.length_];
length_ = str.length_;
memcpy(data_, str.data_, length_);
str.data_ = NULL;
str.length_ = 0;
}
cout << "move assignment " << endl;
}
private:
char* data_;
int length_;
};
注意
在C++11中,拷贝构造/赋值 和 移动构造/赋值 必须同时提供或者同时不提供,程序员才能保证类同时具有拷贝和移动语义,只声明一种的话,类仅能实现一种语义。
上一篇: mysql 统计函数和group by