C++ Primer Plus 学习笔记 第十二章 对象指针小总结下

 

如果是通过定位new运算符创建的对象 在释放内存的时候不会调用对象的析构函数

char * buffer = new char[BUF];

pc1 = new (buffer) JustTesting;

delete [] buffer;

// 这时候是不会调用~JustTesting()的

使用定位new运算符时 要手动的空值内存位置 不然一不小心就把之前见的对象覆盖掉了

pc3 = new (buffer + sizeof(JustTesting))  JustTesting("Better Idea", 6);

正常情况下 使用定位new 运算符时  delete [] 会有释放掉内存 但是如果依然希望程序能够调用析构函数的话

就显式的调用

pc1->~JustTesting();

 

我这里测试出来一个事情:

当调用析构函数后(定位new) 指针依然能够使用 当执行delete [] 释放数组之后才会出现数据异常的情况

如果是正常的new出来的对象 调用析构函数之后 对象指针就没用了

构造函数初始化对象const常量类型的成员时不能直接赋值。 因为人家是常量。需要在程序执行到构造函数体之前进行赋值:

Queue::Queue(int qs) : qsize(qs)

{
    front = rear = NULL;
    items = 0;
}

这种用法仅限于构造函数。 :号后面的成员数量可以不止一个,const和声明为引用的类成员必须用这个方法赋值。

最后那个队列模式

其实就是单链表

// queue.h


#ifndef QUEUE_H_
#define QUEUE_H_

class Customer
{
  private:
    long arrive;
    int processtime;
  public:
    Customer() {arrive = processtime = 0;}

    void set(long when);
    long when() const {return arrive;}
    int ptime() const {return processtime;}
};

typedef Customer Item;

class Queue
{
  private:
    struct Node {Item item; struct Node * next;};
    enum {Q_SIZE = 10};

    Node * front;
    Node * rear;
    int items;
    const int qsize;
    Queue(const Queue & q) : qsize(0) {}
    Queue & operator=(const Queue & q) {return *this;}
  public:
    Queue(int qs = Q_SIZE);
    ~Queue();
    bool isempty() const;
    bool isfull() const;
    int queuecount () const;
    bool enqueue(const Item &item);
    bool dequeue(Item &item);
};

#endif
// queue.cpp

#include "queue.h"
#include <cstdlib>

Queue::Queue(int qs) : qsize(qs)
{
  front = rear = NULL;
  items = 0; 
}

Queue::~Queue()
{
  Node * temp;
  while (front != NULL)
  {
    temp = front;
    front = front->next;
    delete temp;
  }
}

bool Queue::isempty() const
{
  return items == 0;
}
bool Queue::isfull() const
{
  return items == qsize;
}
int Queue::queuecount() const
{
  return items;
}

bool Queue::enqueue(const Item & item)
{
  if (isfull())
    return false;
  Node * add = new Node;
  add -> item = item;
  add->next = NULL;
  items++;
  if (front == NULL)
    front = add;
  else
    rear -> next = add;
  rear = add;
  return true;
}

bool Queue::dequeue(Item & item)
{
  if (front == NULL)
    return false;
  item = front -> item;
  items--;
  Node * temp = front;
  front = front -> next;
  delete temp;
  if (items == 0)
    rear = NULL;
  return true;
}

void Customer::set(long when)
{
  processtime = std::rand() % 3 + 1;
  arrive = when;
}

 

bank.cpp

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "queue.h"
const int MIN_PER_HR = 60;

bool newcustomer(double x);

int main()
{
  using std::cin;
  using std::cout;
  using std::endl;
  using std::ios_base;
  std::srand(std::time(0));

  cout << "Case Study: Bank of Heather Automatic Teller\n";
  cout << "Enter maximum size of queue: ";
  int qs;
  cin >> qs;
  Queue line(qs);

  cout << "Enter the number of simulation hours: ";
  int hours;
  cin >> hours;
  long cyclelimit = MIN_PER_HR * hours;
  cout << "Enter the average number of customers per hour: ";
  double perhour;
  cin >> perhour;
  double min_per_cust;
  min_per_cust = MIN_PER_HR / perhour;

  Item temp;
  long turnaways = 0;
  long customers = 0;
  long served = 0;
  long sum_line = 0;
  int wait_time = 0;
  long line_wait = 0;

  for (int cycle = 0; cycle < cyclelimit; cycle++)
  {
    if (newcustomer(min_per_cust))
    {
      if (line.isfull())
        turnaways++;
      else
      {
        customers++;
        temp.set(cycle);
        temp.set(cycle);
        line.enqueue(temp);
      }
    }
    if (wait_time <= 0 && !line.isempty())
    {
      line.dequeue(temp);
      wait_time = temp.ptime();
      line_wait += cycle - temp.when();
      served++;
    }
    if (wait_time > 0)
      wait_time--;
    sum_line += line.queuecount();
  }
  if (customers > 0)
  {
    cout << "customers accepted: " << customers <<endl;
    cout << "    customers served: " << served << endl;
    cout << "       turnaways: " << turnaways << endl;
    cout << "average queue size: ";
    cout.precision(2);
    cout.setf(ios_base::fixed, ios_base::floatfield);
    cout << (double) sum_line / cyclelimit << endl;
    cout << " average wait time: "
         << (double) line_wait / served << " minutes\n";
  }
  else
    cout << "No customers!\n";
  cout << "Done\n";

  return 0;

}

bool newcustomer(double x)
{
  return (std::rand() * x / RAND_MAX < 1);
}

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@凌晨三点半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值