友元函数
友元函数:如果一个 函数A 声明为 class类B 的 friend友元函数 .
那么这个 函数A 可以访问该 class类B 中的任何成员 .使用时等同于public成员 (主要针对private和protected成员),
友元函数 不是 类 的成员函数, 因此 友元函数 在访问 类成员 时, 要通过 类对象 进行访问.
友元函数可以声明在 类中的任何位置,形式为: 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;
}