C++ FAQs学习笔记

来源:互联网 发布:苏州大学知博书店 编辑:程序博客网 时间:2024/05/21 11:08
FAQ 2.11

这里的auto_ptr挺有意思。改编了范例程序如下:

#include <iostream>
#include <memory>
using namespace std;

class Car
{
    static int carObjCount;
    int carObjID;
public:
    Car()
    {
        carObjCount++;
        carObjID = carObjCount;
        cout << "Car() " << carObjID << endl;
    }

    ~Car()
    {
        cout << "~Car() " << carObjID << endl;
    }

    void startEngine()
    {
        cout << "startEngine() " << carObjID << endl;
    }
};

int Car::carObjCount = 0;

typedef auto_ptr<Car> CarPtr;

void f(Car& c)
{
    cout << "f(Car& c) in" << endl;
  c.startEngine();
  cout << "f(Car& c) out" << endl;
}                                                  

void g(CarPtr p)
{
    cout << "g(CarPtr p) in" << endl;
  p->startEngine();
  cout << "g(CarPtr p) out" << endl;
}                                                   

int main()
{
    cout << "Main() in" << endl;
    Car c;
    c.startEngine();

  CarPtr p(new Car());
  f(*p);                                             
  g(p);       
  cout << "Main() out" << endl;
}

尝试注释掉   g(p); 这句,输出果然不一样。CarPtr在g(p)后果然不能用了。查C++ Primer,原来auto_ptr的copy比较特殊,其实是transfer。copy后,原来那个auto_ptr就unbound了,它保存的指针给别人了。

原创粉丝点击