C++友元类

来源:互联网 发布:access数据库窗体查询 编辑:程序博客网 时间:2024/06/06 08:49

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;
}

 

0 0
原创粉丝点击