友元概念
友元函数
定义:
friend<数据类型><友元函数名>(参数列表)
#include<iostream>
using namespace std;
//定义友元函数
class Rectangle
{
private:
double length;
double width;
public:
Rectangle(double l,double w):length(l),width(w){}
friend double area(Rectangle &Rec); //定义友元
};
//友元实现
double area(Rectangle &Rec)
{
return Rec.length*Rec.width;
}
int main()
{
Rectangle Rect(12.0,2.1);
cout<<"The area is "<<area(Rect);
return 0;
}
友元成员
#include<iostream>
#include<string.h>
using namespace std;
class Boy; //提起声明
class Girl
{
private:
char *name;
int age;
public:
Girl(char *n,int num);
void display(Boy &boy);
~Girl();
};
Girl::Girl(char *n,int num)
{
name = new char[strlen(n)+1];
strcpy(name ,n);
age = num;
}
Girl::~Girl()
{
delete name;
}
class Boy
{
private:
char* name;
int age;
public:
Boy(char *n,int a);
friend void Girl::display(Boy &b); //声明友元函数
~Boy();
};
Boy::Boy(char *n,int num)
{
name = new char[strlen(n)+1];
strcpy(name ,n);
age = num;
}
Boy:: ~Boy()
{
delete name;
}
void Girl::display(Boy &b)
{
cout<<"Girl\'s name: "<<name <<" age :"<<age<<endl;
cout<<"Boy\'s name: "<<b.name <<" age :"<<b.age<<endl;
}
int main()
{
Girl g("helinqian",28);
Boy b("yuanqianqian",27);
g.display(b);
return 0;
}
友元类
友元类一般形式:
friend class<友元类名>
using namespace std;
class Boy; //提起声明
class Girl
{
private:
char *name;
int age;
public:
Girl(char *n,int num);
void display(Boy &boy);
~Girl();
};
Girl::Girl(char *n,int num)
{
name = new char[strlen(n)+1];
strcpy(name ,n);
age = num;
}
Girl::~Girl()
{
delete name;
}
class Boy
{
private:
char* name;
int age;
public:
Boy(char *n,int a);
friend class Girl; //声明类girl是类boy的友元函数
~Boy();
};
Boy::Boy(char *n,int num)
{
name = new char[strlen(n)+1];
strcpy(name ,n);
age = num;
}
Boy:: ~Boy()
{
delete name;
}
void Girl::display(Boy &b)
{
cout<<"Girl\'s name: "<<name <<" age :"<<age<<endl;
cout<<"Boy\'s name: "<<b.name <<" age :"<<b.age<<endl;
}
int main()
{
Girl g("helinqian",28);
Boy b("yuanqianqian",27);
g.display(b);
return 0;
}
注意事项:
友元关系不能被继承。
友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
友元可以访问类的私有成员。
只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。
友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。
类必须将重载函数集中每一个希望设为友元的函数都声明为友元。
友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。
友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
友元可以访问类的私有成员。
只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。
友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。
类必须将重载函数集中每一个希望设为友元的函数都声明为友元。
友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。