第十章[1] 友元

时间:2022-04-04 22:09:30

友元的定义

定义

自己概述

类外的函数,想要调用类中的元素+对象,所以和类建立了友元的关系

文本概述

友元函数:一般的成员函数+类中的成员函数

作用:类中的保护和私有成员à其它类/其它函数调用

定义形式

friend 返回值类型 友元函数名(){};

 友元函数的使用方式有两种:一般的成员函数+类中的成员函数,下面是对应的举例

一般的成员函数作为友元函数

/*
* 题目名称:友元函数的应用
* 输出:The distance is:
       /5
* 题型概论:友元
我的理解:类外的函数,想要调用类中的元素+对象,所以和类建立了友元的关系
文本解释:让类中的保护和私有成员被其它类或者其它函数调用
友元函数:一般的成员函数或者类中的成员函数(此处是类中的成员函数)
定义形式:friend 返回值类型 友元函数名(){};
* 评论:这个是友元函数的一中:一般的成员函数
调用类中的对象作为形参时要用【(类名 &对象名)】的形式
* 难度系数:7
*/
#include <iostream>
#include <string>
using namespace std;
class point
{
double x,y;                 
public:
point(double a=0,double b=0)   //构造函数
    {  
x=a;
y=b;
}
    point(point &p);                //拷贝构造函数
    double getx()
    {  
return x; 
}
    double gety()
    {  
return y;
}
friend double dist(point &p1,point &p2); //友元函数的声明   
};
double dist(point &p1,point &p2)  //友元函数的定义 
{
return (sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
void main()
{
point ob1(1,1);
point ob2(4,5);
cout<<"The distance is:"<<dist(ob1,ob2)<<endl;
system("pause");
}

【类中的成员函数作为友元函数】

/*
* 题目名称:友元函数的应用
* 输出:girl\'s name:+Stacy+      age:+15
        boy\'s name:+Jim+      age:+16
* 题型概论:友元
我的理解:类外的函数,想要调用类中的元素+对象,所以和类建立了友元的关系
文本解释:让类中的保护和私有成员被其它类或者其它函数调用
友元函数:一般的成员函数或者类中的成员函数(此处是类中的成员函数)
定义形式:friend 返回值类型 友元函数名(){};
友元函数中的形参可以和其它的形参一样(可以调用类中的对象)
在一个类中使用另外一个类,该类不一定在此之前已定义,但是一定要提前声明
* 评论:这个是友元函数的一中:其它类中的友元函数
* 难度系数:8
*/
#include <iostream>
#include <string>
using namespace std;
class boy;      //因为友元函数prt()带了girl和boy两个类的对象,而boy
//要在后面才声明,所以提前声明它,以便使用该类的对象
class girl
{
char *name;
int age;                       
public:
    girl(char *n,int a)
    {
name=new char[strlen(n)+1];
strcpy(name,n);
age=a;
    } 
    void prt(boy &);   // 
~girl()
{  
delete name;  
}
};
class boy
{
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 &);        //友元函数的声明
~boy()
{  
delete name;  
}
};
void girl::prt (boy &b)    //友元函数的定义
{
cout<<"girl\'s name:"<<name<<"      age:"<<age<<"\n";
cout<<"boy\'s name:"<<b.name<<"      age:"<<b.age<<"\n";
}
void main()
{
girl g("Stacy",15);
boy b1("Jim",16);
g.prt(b1);       
system("pause");
}