函数作为友元
#include <iostream>
#include <string>
using namespace std;
class Girl
{
public:
Girl(string n, int d) : name(n), age(d){}
friend void disp(Girl& x); // 将disp函数声明为Girl类的友元函数
private:
string name;
int age;
};
void disp(Girl& x)
{
cout << x.name << " " << x.age << endl;
}
int main()
{
Girl g1("翠花", 18);
disp(g1);
return 0;
}
一个函数同时定义为两个类的友元函数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Boy; // 声明Boy类
class Girl
{
public:
Girl(string n, int d) : name(n), age(d){}
friend void PriData(Girl& x, Boy& b); // 将PriData函数声明为Girl类的友元函数
private:
string name;
int age;
};
class Boy
{
public:
Boy(string n, int a) : name(n) , age(a) {}
friend void PriData(Girl& x, Boy& b); // 将PriData函数声明为Girl类的友元函数
private:
string name;
int age;
};
void PriData(Girl& x, Boy& b)
{
cout << "Girl info " << endl;
cout << x.name << " " << x.age << endl;
cout << "Boy info " << endl;
cout << b.name << " " << b.age << endl;
}
int main()
{
Girl g1("翠花", 18);
Boy b1("张三", 20);
PriData(g1, b1);
return 0;
}
成员函数作为函数的友元
一个类的成员函数作为为另一个类的友元函数时,必须先定义这个类
#include <iostream>
#include <string>
using namespace std;
// disp为类Boy的成员函数,又是类Girl的友元函数
class Girl; // 提前声明Girl类,因为disp函数用到了Girl类,而Girl类到后面才被定义
class Boy
{
public:
Boy(string n, int d) : name(n), age(d) {}
void disp(Girl& x);
private:
string name;
int age;
};
class Girl
{
public:
Girl(string n, int d) : name(n), age(d) {}
friend void Boy::disp(Girl& x); // 将disp函数声明为Girl类的友元函数,注意这里要加上Boy::
private:
string name;
int age;
};
// disp需要在类外实现,因为第五行只是声明了Girl类,并没有定义Girl类
void Boy::disp(Girl& x)
{
cout << "Girl info " << endl;
cout << x.name << " " << x.age << endl;
cout << "Boy info " << endl;
cout << name << " " << age << endl;
}
int main()
{
Boy b("张三", 18);
Girl g("翠花", 20);
b.disp(g);
return 0;
}
友元类
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
// 将Boy类声明为Girl类的友元,这样Boy类的成员函数都是Girl类的友元
class Girl;
class Boy
{
public:
Boy(string n, int d) : name(n), age(d) {}
void disp1(Girl& );
void disp2(Girl& );
private:
string name;
int age;
};
class Girl
{
public:
Girl(string n, int d) : name(n), age(d) {}
friend class Boy; // 将Boy类声明为Girl类的友元
private:
string name;
int age;
};
void Boy::disp1(Girl& g)
{
cout << "name" << endl;
cout << name << endl << g.name << endl;
}
void Boy::disp2(Girl& g)
{
cout << "age" << endl;
cout << age << endl << g.age << endl;
}
int main()
{
Boy b("张三", 18);
Girl g("翠花", 20);
b.disp1(g);
b.disp2(g);
return 0;
}
当然,也可以这样做,没有成员函数作为函数的友元那么严格
class Girl
{
public:
Girl(string n, int d) : name(n), age(d) {}
friend class Boy; // 将Boy类声明为Girl类的友元
private:
string name;
int age;
};
class Boy
{
public:
Boy(string n, int d) : name(n), age(d) {}
void disp1(Girl& g)
{
cout << "name" << endl;
cout << name << endl << g.name << endl;
}
void disp2(Girl& g)
{
cout << "age" << endl;
cout << age << endl << g.age << endl;
}
private:
string name;
int age;
};