您的位置:首页 > 编程语言 > C语言/C++

C++基础::shared_ptr 编程细节(二)

2016-02-23 17:15 591 查看
C++基础::shared_ptr 编程细节(一)

C++基础::shared_ptr 编程细节(二)

C++基础::shared_ptr 编程细节(三)

*sp 与 sp.get()

sp.get():返回存储(所持有)的 pointer,也即被持有物的地址

*sp:返回拥有的对象

三种初始化的方法

基本的单参构造

shared_ptr<string> pNico(new string("nico"));


由于“接受单一 pointer 作为唯一实参”的构造函数是 explicit,

shared_ptr<string> pNico = new string("nico");
// ERROR
shared_ptr<string> pNico{new string("nico")};


使用便捷函数 make_shared

shared_ptr<string> pNico = make_shared<string>("nico");


先声明,再 reset

std::shared_ptr<std::string> pNico;
pNico = new std::string("nico");
// ERROR: no assignment for ordinary pointers(对普通指针而言没)
pNico.reset(new std::string("nico"));


operator ==(shared_ptr对象的相等性比较)

首先来看 shared_ptr
相等操作符
(equality operator)的实现形式,

template<class T, class U> inline bool operator==(
shared_ptr<T> const & a, shared_ptr<U> const & b)
{
return a.get() == b.get();
}


而 shared_ptr<T>的
get()
成员返回的是所持有物的地址,若不拥有对象则返回 nullptr。

class A
{
public:
A(int){}
};

int main(int, char**)
{
shared_ptr<A> pA = make_shared<A>(5);
shared_ptr<A> pA2 = pA;

std::cout << std::boolalpha << (pA == pA2) << std::endl;
std::cout << (pA.get() == pA2.get()) << std::endl;
// true,true
// 以上两个判断等价,其实比较的是指针,也即是否指的是同一对象

std::cout << (*pA == *pA2) << s;
// ERROR
// 此时比较的不是指针,而是对象本身,
// 两个类实例的operaotr ==,要求必须在类的内部给出operator==的实现
return 0;
}


也即:

sp1 == sp2

sp1.get() == sp2.get()
比较的是两个指针是否相同,也即两个 shared_ptr 对象是否持有的是对同一个对象的指针,其实这种比较更为严格,因为这里比较的是
两者是否是同一件东西


*sp1 == *sp2

比较的是对象是否相等,如果是类类型,类的内部需要给出operator==的实现,否则出错,如果是基本类型,则比较的是其值;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: