本文共 3679 字,大约阅读时间需要 12 分钟。
如果是通过定位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"#includeQueue::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#include #include #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 <
总结:
转载地址:http://snepi.baihongyu.com/