移动构造函数、移动赋值构造函数、右值引用、构造函数、复制构造函数、拷贝赋值构造函数举例
#include <iostream>
#include <memory>
#include <string.h>
class Test
{
private:
Test(const Test &rhs)
{
number = rhs.number;
m_p = new char[number];
memcpy(m_p,rhs.m_p,number);
std::cout << "复制构造" << std::endl;
}
Test& operator =(const Test &rhs)
{
this->number = rhs.number;
memcpy(m_p,rhs.m_p,number);
return *this;
std::cout << "赋值构造" << std::endl;
}
public:
Test(Test &&rhs):number(rhs.number),m_p(rhs.m_p)
{
rhs.m_p = nullptr;
rhs.number = 0;
std::cout << "移动构造" << std::endl;
}
Test &operator =(Test && rhs)
{
number = rhs.number;
m_p = rhs.m_p;
rhs.number = 0;
rhs.m_p = nullptr;
std::cout << "移动赋值构造" << std::endl;
return *this;
}
Test(int num):number(num)
{
m_p = new char[number];
std::cout << "构造" << std::endl;
}
int number = 0;
char* m_p;
};
void dowork(Test &&p){
Test ss = std::move(p);
std::cout << "Hello, dowork! => " << ss.number << std::endl;
}
int main() {
std::cout << "Hello, World!" << std::endl;
Test p(9);
dowork(std::move(p));
std::cout << "p in main =>" << " " <<p.number << std::endl;
auto fun = [&p]mutable{
Test pp = std::move(p);
};
fun();
int xx = 9;
int xxx = std::move(xx);
std::cout << "xx =>" << " " <<xx << xxx << std::endl;
std::unique_ptr<int> pInt(new int(5));
std::unique_ptr<int> pInt2 = std::move(pInt);
std::cout << *pInt2 << std::endl;
std::unique_ptr<int> pInt3(std::move(pInt2));
std::cout << *pInt3 << std::endl;
return 0;
}