C++中允许声明一个类为另一个类的友元类(friend class):
class B
{
...;
}
class A
{
...;
public:
friend class B;
...;
}
经过上述声明后,类B中的所有成员函数都是A的友元函数。即类B中的所有成员函数都可以访问A类的数据成员和函数。
下面,编写一个程序,实现栈的入栈和出栈。
#include<iostream>
using namespace std;
class Stack;
class Node //节点类的实现
{
int data; //节点值
Node *next; //声明一个Node指针
public:
Node(int d) //初始化Node对象
{
data=d;
next=NULL;
}
friend class Stack; //声明一个友元类
};
class Stack //友元类(栈类)实现,
{
Node *top; //声明一个节点对象top,为了实现原栈Stack的头结点。
public:
Stack() //初始化头结点为空
{
top=NULL;
}
void push(int d) //入栈:通过Node类创建一个新节点p,它的节点值为入栈的d值,头结点为空(即p->next=NULL)。
{
Node *p=new Node(d);
if(top!=NULL)
{
p->next=top; //如果原栈Stack的头结点top不为空(即原栈不为空),把新节点p的下一个指针指向原栈头结点top。
}
top=p; //不然把新节点p指向头结点top以入栈。
}
int pop(int &c) //出栈:这时形参c为引用类型,则可以返回经过该函数处理后得到的c引用的变量值。
{
Node *p=top; //创建一个备用节点p,它是头结点的备胎
if(top!=NULL) //如果原栈不为空,将备胎的节点值赋值给c。
{
c=p->data; //将头结点的节点值赋值给c
top=top->next; //把原头结点后移一位。
delete p; //一定删除备用备胎节点p
return 1;
}
else
return 0;
}
};
void main()
{
Stack s;
int c;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
cout<<"出栈次序:"<<endl;
while(s.pop(c))
cout<<c<<" "<<endl;
}