核心是 1.delete掉左值引用的拷贝构造和赋值重载
2.使用右值引用+移动构造和移动
头文件 my_unique_ptr.h
#ifndef MY_UNIQUE_PTR
#define MY_UNIQUE_PTR
class my_unique_ptr { //单独的int型
private:
int* raw_ptr;
public:
my_unique_ptr(void* mem);
~my_unique_ptr();
my_unique_ptr(const my_unique_ptr& p) = delete; //采用delete 方法 或者声明到private里面,禁用传统拷贝构造和赋值运算符重载
my_unique_ptr& operator= (const my_unique_ptr& p) = delete;
my_unique_ptr(my_unique_ptr&& p); //移动构造
my_unique_ptr& operator= (my_unique_ptr&& p); //移动=重载
void show();
};
#endif
源文件 my_unique_ptr.cpp
#include "my_unique_ptr.h"
#include <iostream>
my_unique_ptr::my_unique_ptr(void* mem) {
raw_ptr =(int*) mem;
}
my_unique_ptr::~my_unique_ptr() {
if (raw_ptr != nullptr)
delete raw_ptr;
}
my_unique_ptr::my_unique_ptr(my_unique_ptr&& p) {
raw_ptr = p.raw_ptr;
p.raw_ptr = nullptr;
}
my_unique_ptr& my_unique_ptr::operator= (my_unique_ptr&& p) {
raw_ptr = p.raw_ptr;
p.raw_ptr = nullptr;
return *this;
}
void my_unique_ptr::show() {
if (raw_ptr == nullptr)
std::cout << "this unique_ptr is nullptr" << std::endl;
else
std::cout << "the val is: " << *raw_ptr << std::endl;
}
主函数:
#include <iostream>
#include "my_unique_ptr.h"
int main() {
my_unique_ptr p1 = new int(3);
my_unique_ptr p2 = std::move(p1); //这时调用的其实是拷贝构造
//my_unique_ptr p3(p2); //会报错
//my_unique_ptr p3=p2; //会报错
my_unique_ptr p3(std::move(p1));
my_unique_ptr p4;
p4 = std::move(p2); //这时调用的才是=重载
p1.show();
p2.show();
p3.show();
p4.show();
return 0;
}
赋值重载