c++11 智能指针 (std::unique_ptr)(五)

定义于头文件 
template< class T, class Deleter = std::default_delete>
 class unique_ptr; (1) (C++11 起) 
template < class T,class Deleter>
class unique_ptr; (2) (C++11 起) 

返回指向被管理对象的指针

std::unique_ptr::get
pointer get() const noexcept;             (C++11 起) 

返回指向被管理对象的指针,如果无被管理对象,则为 nullptr 。

参数

(无)

返回值

指向被管理对象的指针,无被管理对象,则为 nullptr 。

调用示例

#include 
#include 
#include 

int main()
{
    std::unique_ptr s_p(new std::string("Hello, world!"));
    std::string *s = s_p.get();
    std::cout << *s << '\n';
}

输出

返回用于析构被管理对象的删除器

std::unique_ptr::get_deleter
Deleter& get_deleter() noexcept;              (C++11 起) 

const Deleter& get_deleter() const noexcept;  (C++11 起) 

返回会用于析构被管理对象的删除器对象。

参数

(无)

返回值

存储的删除器对象。

调用示例

#include 
#include 

struct Foo
{
    Foo()
    {
        std::cout << "Foo...\n";
    }
    ~Foo()
    {
        std::cout << "~Foo...\n";
    }
};

struct D
{
    void bar()
    {
        std::cout << "Call deleter D::bar()...\n";
    }
    void operator()(Foo* p) const
    {
        std::cout << "Call delete for Foo object...\n";
        delete p;
    }
};

int main()
{
    std::unique_ptr up(new Foo(), D());
    D& del = up.get_deleter();
    del.bar();
}

输出

c++11 智能指针 (std::unique_ptr)(五)_第1张图片

检查是否有关联的被管理对象

std::unique_ptr::operator bool
explicit operator bool() const noexcept;    (C++11 起) 

检查 *this 是否占有对象,即是否有 get() != nullptr 。

参数

(无)

返回值

若 *this 占有对象则为 true ,否则为 false 。

调用示例

#include 
#include 

int main()
{
    std::unique_ptr ptr(new int(42));

    if (ptr)
    {
        std::cout << "before reset, ptr is: " << *ptr << '\n';
    }
    ptr.reset();
    if (ptr)
    {
        std::cout << "after reset, ptr is: " << *ptr << '\n';
    }
}

输出

c++11 智能指针 (std::unique_ptr)(五)_第2张图片

解引用指向被管理对象的指针

std::unique_ptr::operator*
typename std::add_lvalue_reference::type operator*() const;  (1) (C++11 起) 

pointer operator->() const noexcept;     (2) (C++11 起) 

operator*operator-> 提供到 *this 所占有的对象的访问。

若 get() == nullptr 则行为未定义。

参数

(无)

返回值

1) 返回 *this 所占有的对象,等价于 *get() 。

2) 返回指向 *this 所占有对象的指针,即 get() 。

异常

1) 可能抛出,例如若 pointer 定义抛出的 operator*

调用示例

#include 
#include 

struct Foo
{
    void bar() const
    {
        std::cout << "Foo::bar\n";
    }
};

void f(const Foo& foo)
{
    foo.bar();
    std::cout << "f(const Foo&)\n";
}

int main()
{
    std::unique_ptr ptr(new Foo);

    ptr->bar();
    f(*ptr);
}

输出

c++11 智能指针 (std::unique_ptr)(五)_第3张图片

提供到被管理数组的有索引访问

std::unique_ptr::operator[]
T& operator[](size_t i) const;         (C++11 起) 

operator[] 提供对 unique_ptr 所管理的数组元素的访问。

参数 i 必须小于数组中的元素数;否则行为未定义。

参数

i - 要返回的元素的索引

返回值

返回在索引 i 的元素,即 get()[i] 。

调用示例

#include 
#include 

int main()
{
    const int size = 10;
    std::unique_ptr fact(new int[size]);

    for (int i = 0; i < size; ++i)
    {
        fact[i] = (i == 0) ? 1 : i * fact[i - 1];
    }

    for (int i = 0; i < size; ++i)
    {
        std::cout << i << ": " << fact[i] << '\n';
    }
}

输出

c++11 智能指针 (std::unique_ptr)(五)_第4张图片

 

你可能感兴趣的:(C++11新特性,c++,智能指针,unique_ptr)