2014年1月21日 ? 内容整理自《程序设计教程:用C++语言编程 第三版》 陈家骏 ?郑滔
---------------------------------------------------------------------------------------------------------------------------------
例题1:用类来实现“栈”这一数据结构
#include<iostream>
//数据抽象和类的解决方案
//先定义栈的类型,这里采用类实现
//它把栈数据的表示和对栈数据的操作放在一起来描述
const int STACK_SIZE=100;
class Stack{
public:
??? Stack(){
??????? top=-1;
??? }//构造函数
??? void push(int i){
??????? if(top==STACK_SIZE-1){
??????????? std::cerr<<"Stack is overflow\n";
??????????? exit(-1);
??????? }
??????? else{
??????????? top++;
??????????? buffer[top]=i;
??????????? return;//终止函数
??????? }
??? }//void
??? void pop(int &i)
??? //用i拿出来
??? {
??????? if(top==-1){
??????????? std::cerr<<"Stack is empty.\n";
??????????? exit(-1);
??????? }
??????? else{
??????????? i=buffer[top];
??????????? top--;
??????????? return;
??????? }
??? }//pop
private:
??? int top;
??? int buffer[STACK_SIZE];//顺序栈的实现数组buffer
};//class stack
//基于上面的栈类来使用栈类型数据
int main(){
? Stack st;//定义一个栈类型的对象st,它会自动地调用st.Stack()并对st进行初始化
? st.push(12);//把12放进栈st
? int x;
? st.pop(x);//把栈顶元素退栈并且存入变量x
? st.top=-1;//error:top是私有变量,对用户不可见
? st.top++;//error
? st.buffer[st.top]=12;//error
? st.f();//error没有提供操作f()
}
---------------------------------------------------------------------------------------------------------------------------------
例题2:类的成员函数:
- 可以在类内声明和定义
- 也可以在类内声明,在类外定义(尤其注意书写格式)
成员的访问控制--信息隐藏
- public:成员的访问不受限制,在程序中的任何地方都可以访问一个类的public成员
- private:成员只有在本类和友元中访问,一般情况下类的数据成员,和在类的内部使用的成员函数都应该指定为private,只有提供给外界使用的成员函数才制定为public;指定为public的访问控制成员构成了类与外界的接口(interface),在一个类的外部只能访问该类接口中的成员。
- protected:成员只能在本类、友元和派生类中访问,在之后的文章中仔细讨论。
各种结构的默认访问控制
- class(类)的默认访问控制是private
- struct(结构) 的默认访问控制是public
- 联合成员的 默认访问控制是public
【例题3】用链表实现栈类Stack
#include<iostream>
using namespace std;
class LinkStack{
private:
struct Node{
int content;//结点数据域
Node* next;//结点指针域
}*top;
public:
LinkStack(){top= nullptr;}//构造函数
void push(int i);//声明函数push,功能是入栈
void Pop(int& i);//声明函数pop,功能是出栈
};//Class LinkStack
void LinkStack::push(int i){
Node *p=new Node;//
if(p==nullptr){
cerr<<"Stack is overflow\n";
exit(-1);
}else{
p->content=i;
p->next=top;//头插法
top=p;
return;
}
}//push函数定义完毕
void LinkStack::Pop(int &i) {
if(top== nullptr){
cerr<<"Stack is Empty.\n";
exit(-1);
}else{
Node *p=top;
top=top->next;
i=p->content;
delete p;
return;
}
}//pop函数定义完毕
int main(){
}