unique_ptr函数调用
#include <iostream>
#include <memory>
#include "cat.h"
void do_with_cat_pass_value(std::unique_ptr<cat> c){
c->cat_info();
}
void do_with_cat_pass_ref(std::unique_ptr<cat> &c){
c->cat_info();
c->set_name("dd");
c->cat_info();
c.reset();
}
void do_with_cat_pass_ref_const(const std::unique_ptr<cat> &c){
c->cat_info();
c->set_name("dd");
c->cat_info();
// c.reset(); //加了const之后不能reset()
}
std::unique_ptr<cat> get_unique_ptr(){
std::unique_ptr<cat> p_dog=std::make_unique<cat>("Local cat");
std::cout<<"unique ptr address: "<<p_dog.get()<<std::endl;//unique ptr address: 0x1f7e3d51b40
std::cout<<"unique ptr address: "<<&p_dog<<std::endl;//unique ptr address: 0x9c491ff8c8
return p_dog;
}
using namespace std;
int main(){
// std::unique_ptr<cat> c1= std::make_unique<cat>("aa");
// //1. pass by value:
// //do_with_cat_pass_value(c1); //报错,所有权问题
// do_with_cat_pass_value(std::move(c1)); //cat name: aa, destructor of cat: aa
// //调用完直接析构
// // c1->cat_info();//编译能过,但是执行出错
// do_with_cat_pass_value(make_unique<cat> ("bb") ); //cat name: bb, destructor of cat: bb
// // 1.隐式转换move 2.调用完直接析构
// //2. pass by ref
// std::unique_ptr<cat> c2=std::make_unique<cat>("cc");
// //2.1 不加const:
// do_with_cat_pass_ref(c2);//cat name: cc cat name: dd
// //destructor of cat:
// // 如果调用的函数中没有 reset(), destructor发生在整个程序运行结束之后
// //如果有,reset()之后就destructor,
// //c2->cat_info(); //reset()之后不能cat_info()
// //2.2 加const,不能在ref函数中reset
// std::unique_ptr<cat> c3=std::make_unique<cat>("ff");
// do_with_cat_pass_ref_const (c3);//cat name: ff cat name: dd
// c3->cat_info();//cat name: dd
// //destructor发生在整个程序运行结束之后
// cout<<"-----over-----------"<<endl;
//链式
get_unique_ptr()->cat_info();
return 0;
}