队列

const数据成员无法被赋值

有const限定的字符不能改变其值,只能在被创建的时候进行初始化,比如

const int qsize;
qsize = 10;
cout << qsize << endl;

错误结果如下:

在这里插入图片描述

引用数据类型无法被赋值

例如 :

int size = 10;
int & qsize;
qsize = 11 ;
cout << size << endl;

报错 :

在这里插入图片描述

修改如下 :

int & qsize = size;

成员初始化列表

如果Queue类中的成员含有const类型和引用类型如下

class Queue
{
private:
	const int qsize;
	int & Qsize;
	...
};

构造函数如下 :

Queue :: Queue(int m = 10)
{
	qsize = m;
	Qsize = m;
	...
}

这是种不正确的初始化的方法,qsize和Qsize都是不能被赋值的,C++中有一种特殊语法成员初始化列表解决.

例如Classy是一个类,mem1,mem2,mem3是这个类的数据成员,则类构造函数可以使用如下语法来初始化数据成员:

Classy :: Classy(int n , int m ) : mem1(n),mem2(0),mem3(n * m + 2)
{
	//...
};

在函数名之后加入mem1(n),mem2(0),mem3(n * m + 2),相当于把mem初始化为参数n,mem2初始化为0,mem3初始化为参数n和m的式子:n * m + 2,可以直接对const类型和引用数据成员使用,这种方法只现定于构造函数.

  • 成员初始化类表只适用于构造函数
  • 必须用这种格式来初始化const类型和引用类型变量

这种方法也适用于常规初始化,例如:

int games(162);
int games = 162;

double games(162.0);
oduble talk(162.0);

c++11中支持类中可以进行初始化,比如

class Classy
{
	int mem1 = 10;
	const int mem2 = 20;
	...
};

这跟

Classy :: Classy(int n , int m ) : mem1(n),mem2(0),mem3(n * m + 2)
{
	//...
};

所完成的事情等效,前提是你的编译器支持c++11标准.

队列类及实现

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 qsize = Q_size);
	    ~Queue();
	    bool isempty() const;
	    bool isfull() const;
	    int queuecount() const;
	    bool enqueue(const Item & item);     // 进队
	    bool dequeue(Item & item);      // 出队
	};

	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;
	}
星期日, 05. 一月 2020 03:34下午 

星期日, 05. 一月 2020 03:34下午

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值