explicit 修饰constructor
比较区别:
1 | // 无explicit |
bar b3 = 3
含义是,3的类型int正好是bar单参数构造函数的参数类型int,这时候编译器就自动调用这个构造函数,创建一个bar的对象。这在explicit
修饰下是不可行的,只能显式地以3为参数传给构造函数。
shared_ptr<>
理解shared_ptr可以这样理解:
对于std::shared_ptr<string> ptr(new string)
,这里有两个对象,“我”和“你”(均为指针)。“我”是ptr
,而“你”对应了new string
。这时“我”和“你”就有了关系,“我”管理“你”。当new string
即“你”不存在时,我不管理任何人,即我管理一个空指针。
定义并初始化
定义一个空共享指针,指向类型为int的对象, owns no pointer(“我”没有管理任何指针), 由于ptr1是空指针,所以为ptr1所指向的对象赋值是违法的:segmentation fault
:
1 | std::shared_ptr<string> ptr1; |
初始化一个shared_ptr ptr2,非空指针,指向“”。此后,ptr2 就可以像string* 类型的指针一样使用。ptr2 可以管理使用new 关键字分配出来的指针。(new 出来的一定是个指针)
1 | // ptr2 管理一个指向string的指针 |
常用的初始化方法:
1 | // 一般的初始化一个shared_ptr方法 |
成员方法
ptr.get()
方法,它返回一个指针,这个指针指向ptr所指向对象:
1 | string* p = ptr4.get(); |
ptr.reset()
方法,改变ptr所指向内容。这里有个好例子:
1 | std::shared_ptr<int> sp; // empty |
以下情况相同:
1 | ptr4.reset(new string("string reset ptr4")); |