友元函数的三种实现方式

1.为什么要使用友元函数

在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。

2.友元函数的使用

2.1友元函数的参数

因为友元函数没有this指针,则参数要有三种情况:
2.1.1要访问非static成员时,需要对象做参数;
2.1.2要访问static成员或全局变量时,则不需要对象做参数;
2.1.3如果做参数的对象是全局对象,则不需要对象做参数;

2.2友元函数的位置

可以直接调用友元函数,不需要通过对象或指针,这句话应该不适用于友元类或者用A类中的函数作为B类的友元函数.上面两种情况应该先声明对象A才能调用A中的友元函数.

3.友元函数的三种实现形式

3.1 是类本身的友元函数

#include "stdafx.h"
#include 
#include 

using namespace std;

class A
{
  private:
         int age;
         double salary;
  public:
   A(int x);
   friend void print(A& a);//此处定义了友元函数,注意函数体在类外的声明
};

A::A(int x):age(0),salary(10.00) //构造函数初始化,注意类成员的初始化
{

  cout<<age<<endl;
  cout<<salary<<endl;

}

void print(A& a)  //友元函数定义
{
   a.age=40;
   a.salary=88888.8;
   cout<<a.age<<endl;
   cout<<a.salary<<endl;

}

int _tmain(int agrc,_TCHAR* argv[])
{
   A a(10);
   print(a);//直接调用就可以了
   system("pause");
   return 0;
}

3.2 A类中的某个函数是B类的友元函数

#include "stdafx.h"
#include "stdlib.h"
#include 

using namespace std;

class B;

class A
{
  public:
  void print(B& b);
};

class B
{
  private:
  int age;
  double salary;
  public:
  B();
  friend void A::print(B& b);//在此声明A类中的print函数是B的友元函数
};

B::B():age(0),salary(10.0)
{
   cout<<age<<endl;
   cout<<salary<<endl;
}

void A::print(B& b)
{
  b.age=40;
  b.salary=88888.8;
  cout<<b.age<<endl;
  cout<<b.salary<<endl;
}
int _tmain(int argc,_TCHAR* argv[])
{
   A a;
   B b;
   a.print(b);
   system("pause");
   return 0;
}

3.3 声明A类为B类的友元类,那么A中所有的函数都可以调用B类中的成员

#include "stdafx.h"
#include "stdlib.h"
#include 

using namespace std;

class B;

class A
{
public:
	void print(B& b);
  
};

class B
{
  private:
     int age;
     double salary;
  public:
     B();
     friend A;//声明A为友元类

};
B::B():age(0),salary(10.0)
{
  cout<<age<<endl;
  cout<<salary<<endl;
}
void A::print(B& b)
{
  b.age=40;
  b.salary=88888.8;
  cout<<b.age<<endl;
  cout<<b.salary<<endl;
}

int _tmain(int argc,_TCHAR* argv[])
{
   B b;
   A a;
   a.print(b);
   system("pause");
   return 0;
}

是哪个类的友元函数,就应该将friend关键字声明在这个类中。或者说friend 函数和函数所在类才构成友元关系

你可能感兴趣的:(C++)