Chapt.4 Utilities——auto_ptr & pair

Pair对

  1. class Pair 可以将两个值视为一个单元,c++标准库中任何两个需要返回两个值的地方都要pair。
  2. pair中的make_pair函数可以不显式指定类型的构造一个pair对象,如:
    1. void f(std::pair<int, const char*>);
    2. void g(std::pair<const int, std:: string>);
    3. ……
    4. void foo()
    5. {
    6. f(std::make_pair(42, "hello"));
    7. g(std::make_pair(42, "hello"));
    8. }
    上面的代码中,并没有显示的使用类似于f(std::make_pair<int, const char*>(42, "hello"))这样繁杂的写法,即使make_pair的两个值不完全符合要求,在template的帮助下也能顺利工作。
    而当一句代码准确的指出其中的类型时,产生出来的pair就有绝对明确的类别。如:
    std::pair (42, 7.77)与std::pair(42, 7.77)是有区别的。后者生成的元素,默认的类型是double(无任何修饰符的浮点字面常数被视为double型),当我们使用重载函数的时候,准确的类型非常重要。

auto_ptr

  1. auto_ptr是c++提供的一种智能型指针,帮助程序员“防止被异常抛出时发生泄漏资源”。
  2. auto_ptr是一种这样的指针:它是“它所指向的对象”的拥有者(owner),所以当身为对象拥有者的auto_ptr被销毁时,该对象也会被自动销毁。auto_pair要求一个对象只有一个拥有者,严禁一物二主。
  3. auto_ptr的接口与一般的指针非常类似:星号操作符用来解引用,->操作符用来指向对象中的成员,但是,所有的指针运算(包括++)都没被定义(是件好事)
  4. auto_ptr<>不允许使用一般指针惯用的赋值(assign)初始化方式,你必须直接用数值来完成初始化。如
    1. std::auto_ptr<ClassA> ptr1(new ClassA); //OK
    2. std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
  5. auto_ptr所界定的是一种严格的拥有权观念,也就是说,由于一个auto_ptr会删除所指向的对象,所以这个对象绝对不能同时被别的对象拥有。绝对不能出现多个auto_ptrs同时拥有一个对象的情况。但是copy构造函数和assignment操作符通常会导致这个问题。解决的办法是:令auto_ptr的copy构造函数和assignment操作符将对象的所有权交出去。如:
    1. //通过一个对象初始化auto_ptr
    2. auto_ptr<ClassA> ptr1( new ClassA);
    3. //拷贝函数
    4. //将所有权(归属,ownership)从ptr1转移到ptr2
    5. auto_ptr<ClassA> ptr2(ptr1);
    在上面代码的最后一句中,拷贝构造函数在拷贝的同时将对象的所有权从ptr1转移到ptr2。此后ptr2拥有这个new出来的对象,而ptr1不再拥有,这样对象只会被delete一次——在ptr2被销毁的时候。赋值的动作也类似。
    但是如果ptr2在赋值之前拥有另外的一个对象,那么赋值操作会调用delete,将该对象删除。
  6. 只有auto_ptr可以用来当作另一个auto_ptr的初值,普通指针不可以。


来自为知笔记(Wiz)


posted on 2015-05-19 18:37  利维亚  阅读(189)  评论(0编辑  收藏  举报

导航