友元函数的几种形式

(1)、友元函数

友元函数定义后可以访问类对象的所有成员,包含私有公有和保护成员


友元函数必须在类定义时进行声明,声明时在函数前面添加 friend关键字,该声明可以放到公有或者私有成员中,

友元函数的声明方式:

friend <s数据类型》 《友元函数》<参数表》


<span style="font-size:18px;">#include<iostream>
#include<string>using namespace std;class rectangle
{
private:double length, width;
public:rectangle(double a = 0, double b = 0);double area();friend double mianji(rectangle &r);};rectangle::rectangle(double a,double b)
{length = a;width = b;
}double rectangle::area()
{double s;s = length*width;return s;
}
double mianji(rectangle &r)
{return (r.length*r.width);
}
int main()
{rectangle obj1;rectangle obj2(1.2, 0.5);rectangle r(2.5);cout << obj1.area() << endl;cout << obj2.area() << endl;cout << mianji(r) << endl;system("pause");return 0;
}</span>


友元函数需要注意:

1、友元函数不是类函数,不用加作用与::

2、友元函数不是类的成员,不鞥直接引用对象成员的名字。也不能通过tthis指针引用对象成员,友元函数一般都带有一个类的入口参数,

例如  area(rectangke &obj)

3]、当友元函数访问多个类时,可以将该友元函数定义多个类的友元函数

(2)、友元成员

如果一个类的成员函数时另一个类的成员函数,则称这个成员函数时友元成员。通过友元成员不仅可以访问自己累对象中所有的成员,还可以访问其他类对象的成员,这种方法可以使函数同时访问两个雷。

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
class boy;class girl
{
private:char *name;int age;
public:girl(char* n, int a){name = new char[strlen(n) - 1];strcpy(name, n);age = a;}void prt(boy &b);~girl(){delete name;}
};
class boy
{
private :char* name;int age;
public:boy(char*n, int a){name = new char[strlen(n) - 1];strcpy(name, n);age = a;}friend void girl:: prt(boy& b);~boy(){delete name;}};void girl::prt(boy& b)
{cout << "girl" << name << age << endl;cout << "boy" << b.name << b.age << endl;
}int main()
{girl g1("jgb", 19);boy b1("dfgb", 10);g1.prt(b1);system("pause");return 0;
}</span>


注意点:

1、类的成员函数的成为友元函数时,应在类中表明函数的作用域

2、调用的类对象按顺序看如果没有,应在类的最前面声明类,例如  class boy,因为girl类之间如果没有声明g该类,则友元函数无法调用


(3)友元类

如果一个类作为另一个类的友元,称这个类为友元类,当一个类时另一个类的友元时,这个类的所有成员函数都成为另一个类的友元函数,,友元类中的所有成员函数都可以通过对象名直接访问另一个类中的所有成员。


友元类的声明可以方阿斗类中的任一位置,

 friend class <友元类名》

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
class boy;class girl
{
private:char *name;int age;
public:girl(char* n, int a){name = new char[strlen(n) - 1];strcpy(name, n);age = a;}void prt(boy &b);~girl(){delete name;}
};
class boy
{
private :char* name;int age;
public:boy(char*n, int a){name = new char[strlen(n) - 1];strcpy(name, n);age = a;}friend  calss girl;~boy(){delete name;}};void girl::prt(boy& b)
{cout << "girl" << name << age << endl;cout << "boy" << b.name << b.age << endl;
}int main()
{girl g1("jgb", 19);boy b1("dfgb", 10);g1.prt(b1);system("pause");return 0;
}</span>


Published by

风君子

独自遨游何稽首 揭天掀地慰生平