C++基础---友元

来源:互联网 发布:火狐浏览器打不开淘宝 编辑:程序博客网 时间:2024/05/19 04:06

友元概念


友元函数


定义:
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的友元,同样要看类中是否有相应的申明
友元可以访问类的私有成员。
只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。
友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。
类必须将重载函数集中每一个希望设为友元的函数都声明为友元。
友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。


原创粉丝点击