初学OOP --- 类的进阶内容(2)

本文探讨了C++中的对象常量,包括枚举的使用和作用域,以及如何通过模拟栈实现抽象数据类型,涉及静态变量、内存管理和栈操作。实例演示了如何避免命名冲突,并介绍了Stack类的构造、空栈检查、满栈检查和push/pop操作。
摘要由CSDN通过智能技术生成

目录

一.对象常量,作用域内枚举

二.抽象数据类型(模拟栈的内存管理)


一.对象常量,作用域内枚举

#pragma once


//class.h

#include<iostream>
#ifndef _CLASS_H_
#define _CLASS_H_

class exam
{
private:
	enum {months = 12};
	static const int days = 365;
	double month[months];
	double day[days];
public:
	void fuc(int a = months, int b = days)
	{
		std::cout << a << " , " << b << std::endl;
	}
};


#endif

//对象常量: 所有对象都可以使用的量
// 方法一:枚举 enum { months = 12 },因为此处枚举不会创建类数据成员,所以不需要提供枚举的类型名
// 在类中声明的枚举其作用域为整个类
// 方法二:static静态变量,可以将该常量和其他静态变量放在一起,而不是存储在对象中,即可以被所有对象访问
//const int months = 12 不行的原因: 声明类只是描述了对象的形式,并没有创建对象,所以在创建对象前,该常量都是不存在的,没有存储该量的存储空间

//作用域内枚举: enum class name{ , , ,}  作用:防止不同枚举定义中的枚举量发生名称冲突
// eg: enum class egg{large}   enum class t-shirt(large)
// 此时 egg a = egg::large 和 t-shirt b = t-shirt::large不会发生冲突


//main.cpp

#include"class.h"


int main()
{
	enum class t1 { GodFishhh=1,AFish=2};
	enum class t2 {GodFishhh=10,AFish=20};
	// t1和t2中同名的枚举量不会发生冲突
	t1 temp1 = t1::GodFishhh;
	t2 temp2 = t2::GodFishhh;
	exam c1;
	c1.fuc();
	


	system("pause");
	return 0;

	
}

//1.对象常量: 所有对象都可以使用的量
// 方法一:枚举 enum { months = 12 },因为此处枚举不会创建类数据成员,所以不需要提供枚举的类型名
// 在类中声明的枚举其作用域为整个类
// 方法二:static静态变量,可以将该常量和其他静态变量放在一起,而不是存储在对象中,即可以被所有对象访问
//const int months = 12 不行的原因: 声明类只是描述了对象的形式,并没有创建对象,所以在创建对象前,该常量都是不存在的,没有存储该量的存储空间

//2.作用域内枚举: enum class name{ , , ,}  作用:防止不同枚举定义中的枚举量发生名称冲突
// eg: enum class egg{large}   enum class t-shirt(large)
// 此时 egg a = egg::large 和 t-shirt b = t-shirt::large不会发生冲突

二.抽象数据类型(模拟栈的内存管理)

//class.h

#pragma once

#ifndef _CLASS_H_
#define _CLASS_H_

typedef unsigned long Item; //使得Item相当于unsigned long

class Stack
{
private:
	enum {MAX =10};//类常量,类的所有对象都可以使用
	Item items[MAX]; //items数组相当于栈
	int top;//标记当前数据在栈中的位置
public:
	Stack(); //构造函数
	bool isempty() const;
	bool isfull() const;
	bool push(const Item& item);
	bool pop(Item& item);
};

#endif

//fuc.cpp


#include<iostream> 
#include"class.h"
using namespace std;

Stack::Stack()
{
	top = 0; //将标定参数初始在数组(即栈)的最底端
}

bool Stack::isempty() const
{
	return top == 0;  //返回的结果是top==0的真假
}

bool Stack::isfull() const
{
	return top == MAX; //返回的结构是top==MAX的真假
}


// pop 和 push 过程应当满足 先进后出 原则
bool Stack::push(const Item& item)   //参数相当于 const unsigned long & item
{
	//实现逻辑:如果top<MAX,即栈还未满,则将此处的空位插入item值,插入过程就是要给空位插入,所以对top用后自增
	if (top < MAX)
	{
		items[top++] = item;  
		return true;
	}
	else
	{
		return false;
	}
}

bool Stack::pop(Item& item)  //传递的是引用,因为要对实参进行修改
{
	//实现逻辑:如果top>0,即还未将所有的变量清除,且当前的top处应当是一个空位,所以用前自减移到更上一位,并将该位置的值赋给item,则可以在主函数中输出被pop出栈的值
	if (top >0)
	{
		item = items[--top];
		return true;
	}
	else
	{
		return false;
	}
}

//利用返回值为bool类型的函数来实现


// main.cpp

#include<iostream>
#include<cctype>    // 用到了toupper():将小写字母改为大写字符(大写字母仍为大写字母) 以及 isalpha():判断是否位字母  两个函数
#include"class.h"
using namespace std;


int main()
{
	Stack st;
	char ch;
	Item po;
	cout << "Please enter A to add a purchase order" << endl;
	cout << "P to process a PO,or Q to quit" << endl;
	while (cin >> ch && toupper(ch) != 'Q')
	{
		while (cin.get() != '\n')
		{
			continue;
		}
		if (!isalpha(ch))
		{
			cout << '\a';
			continue;
		}
		switch (ch)
		{
		case 'A':
		case 'a':
			cout << "Enter a PO number to add: ";
			cin >> po;
			if (st.isfull())
			{
				cout << "Stack already full" << endl;
			}	
			else
			{
				st.push(po);
			}		
			break;
		case 'P':
		case 'p':
			if (st.isempty())
			{
				cout << "Stack already empty" << endl;
			}
			else
			{
				st.pop(po);
				cout << po << " has been already popped" << endl;
			}
			break;

		default:
			cout << "wrong input,please input while following the instruction again" << endl;
		}
		
		cout << "Please enter A to add a purchase order" << endl;
		cout << "P to process a PO,or Q to quit" << endl;
	}
	cout << "Bye~" << endl;


	system("pause");
	return 0;
}

//很久没用swtich语句了,有点生疏,整理了一下switch语句的一些用法和注意点

//参考文章:(1条消息) C++中的case标签_舒夜无痕的博客-CSDN博客_c++ case

//1.case关键字和它的对应值一起称为case标签,且case标签必须是整型常量                                         整型常量:

        (1)C++中的const int,注意仅限于C++中的const,C中的const是只读变量,不是常量;

        (2)单个字符,如case 'a': 是合法的,因为文字字符是常量,被转成ASCII码,为整型;

        (3)使用#define定义的整型,#define定义的一般为常量,比如#define pi 3.14,但是也必须是整型才可以;

        (4)使用enum定义的枚举成员。因为枚举成员是const的,且为整型。如果不手动指定枚举值,则默认枚举值为从0开始,依次加1。

//2.case标签只能在开关内使用:即case语句要写在switch的{ }中

//3.若不想case中的所有情况都被调用,则一定要记住每种情况的代码段末尾要加上break;

//4.default(默认)是用于上述所有case情况的值均不满足,跳转运行的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值