1.1 类作用域
在类定义的名称(如类数据成员名和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外不可知。因此可以在不同类中使用相同的类成员名而不会产生冲突。
注意:类的作用域意味着不能够从外部直接访问类的成员,要调用公有成员函数必须通过对象;在定义成员函数,必须使用作用域解析操作符:
void Stock::update(double price){
....
}
在类声明或者成员函数定义中,可以使用未修饰的成员名称(未限定的名称)。构造函数名称在被调用时才可被识别,因为它的名称与类名相同,在其他情况下,使用类成员名时,必须根据上下文使用直接成员操作符(.)间接成员操作符(->)或作用域解析操作符(::)
1.2 作用域为整个类的常量
方法一:在类中声明一个枚举,可用枚举为整型常量提供作用域为整个类的符号名称。这种方式声明枚举并不会创建类成员函数,即所有对象都不包括枚举,只是一个符号名称罢了。
Class Stock
{
Private:
Enum { Len = 30};
Char company[ Len ];
}
方法二:使用关键字static,创建名为Len的常量,该常量将于其他静态变量存储在一起,而不是存储在对象中。
Class Stock
{
Private:
Static const int Len = 30;
Char company[ Len ];
}
2.1 抽象数据类型(ADT)
ADT以通用的方式描述数据类型,而没有引入语言或实现细节,例如通过使用堆栈,可以将int、double、float等数据形式存在栈里,并且总是从栈顶添加或删除数据。
2.2 堆栈的特征
堆栈存储多个数据项,并且可对其执行的操作进行描述:
- 可创建空堆栈
- 将数据项添加到栈顶(压入)
- 从栈顶删除数据项(弹出)
- 查看堆栈是否填满
- 查看兑现是否为空
可将描述转换为类声明,其中公有成员函数提供了表示堆栈操作的接口,而私有数据成员负责存储堆栈数据,类概念非常符合ADT方法。
2.3 程序实现
2.3.1 stack.h文件:
#ifndef STACK_H_
#define STACK_H_
typedef unsigned long Item; //别名
class Stack
{
private:
enum{MAX = 10}; //在类的声明中定义枚举类型,符号常量
Item items[MAX];
int top; //栈顶指针
public:
Stack(); //与类重名的构造函数
bool isempty() const;
bool isfull() const;
bool push(const Item & item);
bool pop(Item & item); //判断是否成功则返回布尔类型
};
#endif
2.3.2 stack.h文件:
#include "stack.h"
Stack::Stack()
{
top = 0;
}
bool Stack::isempty() const
{
return top == 0;
}
bool Stack::isfull() const
{
return top == MAX;
}
bool Stack::push(const Item & item)
{
if(top < MAX)
{
items[top++]=item;
return true;
}
else
return false;
}
2.3.3 stacker.cpp
#include <iostream>
#include "stack.h"
#include <cctype>
using namespace std;
int main(void)
{
char ch;
unsigned long po; //出入栈的内容
Stack st; //定义类的对象
cout<< "Please enter A to push to stack\n"
<<"P to pop from stack, Q to quit \n";
//toupper( )函数用于将小写字母转换为大写字符
while(cin>>ch&& toupper(ch)!='Q') //只要输入值且不是Q,则都可以连续运行
{
while(cin.get() != '\n') //捕获键盘输入去掉enter换行,若没换行则一直循环捕获
continue;
switch(ch)
{
case 'A' ://妙不可言,大小写一起处理
case 'a' :
cout<<"Enter a number you want to push to stack:\n";
cin>>po;
if(st.isfull()) //判断栈是否为满
cout << " Stack already full"<<endl;
else
st.push(po);
break;
case 'P':
case 'p':
if(st.isempty())
cout << "Stack is empty"<<endl;
else
{
st.pop(po);
cout << po << " is poped" << endl;
}
break;
}
cout << "Please enter A to push to stack \n"
<<"P to pop from stack, Q to quit \n";
}return 0;
}
2.4 程序运行结果