随着C++语言的发展,出现了一个新的功能,那便是:智能指针。而智能指针如何赋值,我来在此探讨一下。
目录
1.如何给新创建的智能指针赋值
智能指针初始化的方法如下所示:
//shared_ptr智能指针初始化方法如下:
shared_ptr<类型名>=make_shared<类型名>();
//unique_ptr智能指针初始化方法如下:
unique_ptr<类型名>=make_unique<类型名>();
这实质上是在通过构造函数赋值。其中最末尾的括号中填的是构造函数参数。比方说你建了一个类名为Position,构造函数为两个double函数x和y,你想声明一个Position类的智能指针,可以按如下方式赋值:
unique_ptr<Position> position=make_unique<Position>(1.0,2.0);
而这相当于给普通指针这样赋值:
Position *pos=new Position(1.0,2.0);
总之,最后的括号里写的参数,相当于普通指针初始化时,new xxx后边的括号里写的参数。
2.将普通指针赋值给智能指针
将普通指针赋值给智能指针的方法如下:
//定义一个Position类的普通指针
Position* pos=new Position(1.0,2.0);
//定义一个Position类的智能指针名为pos1,并将pos的值赋给该智能指针
unique_ptr<Position> pos1(pos);
shared_ptr也是同理。
值得一提的是,如果你要赋值给智能指针的普通指针,不是新new出来的,而是像从变量里取的指针,或者从其他智能指针里get出来的话,那么用这种方法有可能会失败。解决方法是,可以再新建一个普通指针并初始化,然后用memcpy函数将原先普通指针里的内容拷贝到新建的普通指针里,然后再用以上方式,将新建的普通指针赋值给智能指针。
示例如下:
Position pos(1.0, 2.0);
Position* pos2=new Position();
std::memcpy(pos2, &pos, sizeof(pos));
std::unique_ptr<Position> pos1(pos2);//shared_ptr也同理
memcpy函数的用法是这样的:
memcpy(目标地址,源地址,数据大小)
前两个参数是指针类型,表示要将第二个参数所指向的地址里的值赋值给第一个参数所指向的地址。第三个参数是所要复制的内存空间大小。
值得一提的是,在使用memcpy进行拷贝之前,目标指针也是要先初始化的。
3.智能指针赋值给智能指针
shared_ptr互相之间赋值
将一个shared_ptr的值赋值给另一个shared_ptr,只需要用=号直接赋值就可以了。
std::shared_ptr<Position> position = std::make_shared<Position>(1.0, 2.0);
std::shared_ptr<Position> position2 = position;
unique_ptr互相之间赋值
unique_ptr互相之间赋值不能使用=直接赋值。将一个unique_ptr中的变量值传给另一个unique_ptr可参考如下代码:
std::unique_ptr<Position> position = std::make_unique<Position>(1.0, 2.0);
std::unique_ptr<Position> position2(std::move(position));
注:文中的Position是我自己写的测试用类。