友元函数/友元类

上一篇 / 下一篇  2007-11-25 14:00:47 / 个人分类:c++

友元函数

友元函数:如果一个  函数A   声明为 class类B  的   friend友元函数 .

 那么这个  函数A   可以访问该  class类B  中的任何成员 .使用时等同于public成员 (主要针对privateprotected成员),

友元函数 不是 成员函数, 因此 友元函数 在访问 类成员 时, 要通过 类对象 进行访问.

友元函数可以声明在 类中的任何位置,形式为:  friend+函数原型;

实例:

//blog的文本编辑功能是在太...格式不整,见谅;

//Visual  Studio  2005 环境之下 

// 友元函数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class A

public:

 A(int i){m_i=i;}

private:
 int m_i;
 friend int func_add(A &a ,int i);  //位置随意
};

int func_add(A &a,int i)
{
 return a.m_i+i;
}

int _tmain(int argc, _TCHAR* argv[])
{
 A a(1); 
 cout<<func_add(a,2);
 getchar();
 return 0;
}

友元类

友元类: 类B 声明为 类A 的友元类 , 那么 类B成员函数 将是 类A友元函数...

类A  的使用方法不变. 

类B对象 可以使用 类B成员函数 ,但是这些 成员函数 是  类A之友元函数  ,因此 类B成员函数 可以 引用  类A的全部成员(protected & private) .

实例:

// 友元类.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class DateII;
class MyDate
{
public:
 MyDate(int n=1,int y=0,int m=0,int d=0);
 ~MyDate();
 int getObjectNum();
 int getYear();
 int getMonth();
 int getDay();
 void MyPrint() const;
private:
 friend DateII;
 int objectNum;
 int myYear;
 const int myMonth;
 const int myDay;
};
///
MyDate::MyDate(int n,int y,int m,int d):myYear(y),myMonth(m),myDay(d)
{
 objectNum = n ;
}

//析构函数
MyDate::~MyDate()
{
}

int MyDate::getObjectNum()
{
 return objectNum;
}
int MyDate::getYear()
{
 return myYear;
}

/////
int MyDate::getMonth()
{
 return myMonth;
}
/////
int MyDate::getDay()
{
 return myDay;
}
///
void MyDate::MyPrint() const  ///const 函数,访问const以及非const成员
{         ///但是不能修改 类的成员函数
// int a=0;
// cout<<a <<endl;
// cout<<++a<<endl;
 cout<<"Date"<<objectNum<<":"
  <<myYear<<"-"
  <<myMonth<<"-"
  <<myDay<<endl;
 return ;
}

class DateII
{
public:
 DateII();
 void PrintMyDate(MyDate &);
};

//构造函数
DateII:: DateII()
{
}

void DateII::PrintMyDate(MyDate &x)
{
 cout<<"MyDate friend class print:"<<endl;
 cout<<"Date"<<x.objectNum<<":"
  <<x.myYear<<"-"
  <<x.myMonth<<"-"
  <<x.myDay<<endl;
// x.myYear++;
 //cout<<endl<<x.myYear<<endl;
 return ;
}

//MAIN()
int _tmain(int argc, _TCHAR* argv[])
{
 MyDate date1(1,1984,9,18);
 date1.MyPrint();
 DateII myDateF;
 myDateF.PrintMyDate(date1);
 getchar();
 return 0;
}


TAG:

引用 删除 Guest   /   2008-02-19 16:04:41
-5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar