C++实现顺序循环队列

本文详细探讨了C++代码中违反Effective C++原则的错误,涉及数组初始化和局部引用返回类型,同时揭示了为何这些错误在VS2017下仍能运行的神秘现象。通过实例解析,提升编程实践中的最佳实践意识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新:
1、第一版的代码在析构函数部分违反了《effective C++》条款16:“………如果你调用new时使用使用[],你必须在对应调用delete时也使用[]。如果你调用new时没有使用[],那么也不该在对应调用delete时使用[]……”,错误保留在注释中。
2、第一版代码还犯了另一个错误,考虑如下代码

template<typename T>
const bool& Queue<T>::IsFull()
{
	return ((Rear + 1) % MaxSize == Front);
}

函数的返回类型是引用类型,但引用绑定的对象是函数内的局部变量,这将导致错误,错误保留在注释中。

非常吊诡的事情是:这两种错误在VS2017下都能被运行,也就是程序能正常跑……,知识浅薄,希望以后能搞清楚原因。

#pragma once
#include<iostream>

using std::cout;

using Position = int;

template<typename T>
class Queue
{
public:
	Queue(int MaxSize=16);
	~Queue();
	/*错误代码记录
	const bool& IsFull();//判断队列是否满
	const bool& IsEmpty();//判断队列是否为空;
	const bool& AddQ(const T& X);//入队
	*/
	bool IsFull();//判断队列是否满
	bool IsEmpty();//判断队列是否为空;
	bool AddQ(const T& X);//入队
	const T & Delete();//出队

private:
	Position Front, Rear;//队列的头和尾
	T* Data;//存放数据的数组
	int MaxSize;//队列最大容量
};

template<typename T>
Queue<T>::Queue(int MaxSize):Data{new T[MaxSize]},Front{ 0 }, Rear{0},MaxSize{MaxSize}{}

template<typename T>
Queue<T>::~Queue()
{
	//delete Data;错误代码记录
	delete[] Data;
}

template<typename T>
//const bool& Queue<T>::IsFull()错误代码记录
bool Queue<T>::IsFull()
{
	return ((Rear + 1) % MaxSize == Front);
}

template<typename T>
//const bool& Queue<T>::AddQ(const T& X)错误代码记录
bool Queue<T>::AddQ(const T& X)
{
	if (IsFull()) {
		cout << "队列满\n";
		return false;
	}
	else {
		Rear = (Rear + 1) % MaxSize;
		Data[Rear] = X;
		return true;
	}
}

template<typename T>
//const bool& IsFull()错误代码记录
bool Queue<T>::IsEmpty()
{
	return (Front == Rear);
}

template<typename T>
const T & Queue<T>::Delete()
{
	if (!IsEmpty()) {
		Front = (Front + 1) % MaxSize;
		return Data[Front];
	}
}
#include"SeqQueue.h"

int main()
{
	Queue<int> Q{};
	for (int i = 0; i < 15; ++i) {
		Q.AddQ(i);
	}
	cout << "Q是否满 " << Q.IsFull() << '\n';
	cout << "Q是否空 " << Q.IsEmpty() << '\n';
	for (int i = 0; i < 15; ++i) {
		cout << Q.Delete() << ' ';
	}
	cout << '\n' << "Q是否满 " << Q.IsFull() << '\n';
	cout << "Q是否空 " << Q.IsEmpty() << '\n';
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值