类:友元函数

三世轮回 提交于 2019-11-28 16:21:52

一、友元函数

1、友元函数

       友元函数不是当前类的成员函数,但它可以访问该类所有的成员,包括私有成员、保护成员和公有成员。    

       在类中声明友元函数时,需在其函数名前加上关键字 friend。    

       友元函数既可以是非成员函数也可以是另一个类的成员函数

class Date {
public:
	Date(int y, int m, int d);             //构造函数
	friend void showDate1(Date &d);         //友元函数
private:
	int year;
	int month;
	int day;
	friend void showDate2(Date &d);         //友元函数
};

Date::Date(int y, int m, int d) {
	year = y;
	month = m;
	day = d;
}

void showDate1(Date &d) {
	cout << d.year << "." << d.month << "." << d.day << endl;
}

void showDate2(Date &d) {
	cout << d.year << "." << d.month << "." << d.day << endl;
}

int main() {
	Date date1(2009, 11, 14);
	showDate1(date1);
	showDate2(date1);
	return 0;
}

(1) 友元函数不是成员函数,声明可以放在公有部分、保护部分、私有部分,不受影响。

(2) 友元函数不是成员函数。因此,在类的外部定义友元函数时,不能像成员函数那样,在函数名前加上“类名∷”

(3) 因为友元函数不是类的成员,所以它不能直接调用对象成员,它必须传入对象对象指针对象引用,来调用该对象的成员。

(4) 一对多,一个函数可以是多个类的友元函数。当一个函数需要访问多个类时,友元函数非常有用。

2、一个普通函数是多个类的友元函数

class Date; //对Date类的提前引用声明


class Time { //声明类Boy
public: 
    Time(int h,int m,int s)//定义构造函数 
    { 
        hour =h;  
        minute =m;   
        sec =s;
    }
    friend void showDate_Time(Date &d,Time &t) ;
private:
    int hour;   
    int minute;  
    int sec; 
};


class Date { //声明类Date
public:
    Date(int y,int m,int d)//定义构造函数
    { 
        year=y;  
        month=m;  
        day=d; 
    }
    friend void showDate_Time(Date &d,Time &t); 
private:
    int year;  
    int month; 
    int day; 
};


void showDate_Time (Date &d,Time &t) 
{cout<<d.year<<"."<<d.month<<"."<<d.day<<endl;   
 cout<< t.hour <<":"<< t.minute <<":"<< t.sec <<endl; 
}


int main() { 

    Date date1(2009,11,14);       //定义Date类对象date1
    Time time1(6,12,18);          //定义Time类对象time1

    showDate_Time (date1,time1);   

    return 0;  
}

 

3、一个类的成员函数作为另一个类的友元函数

class Date;  //对Date类的提前引用声明


class Time {
public: 
    Time (int h,int m,int s)   //定义构造函数
    { 
        hour =h; 
        minute =m; 
        sec =s;
    }
    void showDate_Time(Date &);   //成员函数
private:
    int hour; 
    int minute; 
    int sec; 
};


class Date {
public:
    Date(int y,int m,int d)   //定义构造函数
    { 
        year=y;
        month=m; 
        day=d; 
    }
    friend void Time::showDate_Time(Date &);   //友元函数
private:
    int year; 
    int month; 
    int day;
};


void Time::showDate_Time (Date &d) {
    cout << d.year << "." << d.month << "." << d.day << endl;   
    cout << hour << ":" << minute << ":" << sec << endl;  
}

int main() {

    Date date1(2009,11,14);        //定义Date类对象date1
    Time time1(6,12,18);           //定义Time类对象time1

    time1.showDate_Time(date1); 

    return 0; 
}

         类Time的成员函数为类Date的友元函数,必须先定义类Time

         并且在声明友元函数时,要加上成员函数所在类的类名,如:  friend void Time::showDate_Time(Date &);

 

二、C++为什么要引入友元函数

       (1) 声明了一个类的友元函数,就可以用这个函数直接访问该类的私有数据,从而提高了程序运行的效率。    

       (2) 友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。尤其 当一个函数需要访问多个类时,友元函数非常有用。    

       (3) 引入友元机制的另一个原因是方便编程,在某些情况下,如运算符被重载时,需要用到友元函数。   

       缺点:破坏了数据的隐蔽性类的封装性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的。因此使用友元函数应谨慎。

 

三、友元类

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!