《C++ Primer Plus》第十章 对象和类-类作用域、抽象数据类型

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 堆栈的特征

        堆栈存储多个数据项,并且可对其执行的操作进行描述:

  1. 可创建空堆栈
  2. 将数据项添加到栈顶(压入)
  3. 从栈顶删除数据项(弹出)
  4. 查看堆栈是否填满
  5. 查看兑现是否为空

        可将描述转换为类声明,其中公有成员函数提供了表示堆栈操作的接口,而私有数据成员负责存储堆栈数据,类概念非常符合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 程序运行结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值