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

    • auto_ptr是c++提供的一种智能型指针,帮助程序员“防止被异常抛出时发生泄漏资源”。
    • auto_ptr是一种这样的指针:它是“它所指向的对象”的拥有者(owner),所以当身为对象拥有者的auto_ptr被销毁时,该对象也会被自动销毁。auto_pair要求一个对象只有一个拥有者,严禁一物二主。
    • auto_ptr的接口与一般的指针非常类似:星号操作符用来解引用,->操作符用来指向对象中的成员,但是,所有的指针运算(包括++)都没被定义(是件好事)
    • auto_ptr<>不允许使用一般指针惯用的赋值(assign)初始化方式,你必须直接用数值来完成初始化。如
       
          
      1. std::auto_ptr<ClassA> ptr1(new ClassA); //OK
      2. std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
    • 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,将该对象删除。
    • 只有auto_ptr可以用来当作另一个auto_ptr的初值,普通指针不可以。




转载于:https://www.cnblogs.com/levihsia/p/4515258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值