提到友元類,一般會同時提到友元函式。兩者在許可權開放上類似。
採用類的機制後實現了數據的隱藏與封裝,類的數據成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函式,這些函式不是類的一部分(注意友元函式不是類的一部分),但又需要頻繁地訪問類的數據成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式外,還有友元類,兩者統稱為友元。友元的作用是提高了程式的運行效率(即減少了類型檢查和安全性檢查等都需要時間開銷),但它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。
友元函式
1.1將全局函式聲明為友元函式
class Time{ public: Time(int=1,int=1,int=1); friendvoid call(Time &);//聲明友元函式 private: int hour; int min; int sec; }; Time::Time(int h,int m,int s){ hour=h; min=m; sec=s; } void call(Time &t) {//全局函式,且是Time類的友元函式 cout<<"Call:"<<t.hour<<"-"<<t.min<<"-"<<t.sec<<endl;//訪問private成員 } int main(){ Time t; call(t); system("PAUSE"); return EXIT_SUCCESS; } |
1.2友元成員函式
class Date; //對Date類的提前引用聲明 class Time{ public: Time(int=1,int=1,int=1); void call(Date &);//聲明成員函式 private: int hour; int min; int sec; }; class Date{ public: Date(int=1,int=1,int=2008); friendvoid Time::call(Date&); //聲明Time類的call為本類的友元成員函式 private: int year; int mon; int day; }; Time::Time(int h,int m,int s){ hour=h; min=m; sec=s; } void Time::call(Date &d) { cout<<"TIME:"<<hour<<"-"<<min<<"-"<<sec<<endl; cout<<"DATE:"<<d.mon<<"-"<<d.day<<"-"<<d.year<<endl; //訪問Date類的private成員 } Date::Date(int m,int d,int y){ mon=m; day=d; year=y; } int main(){ Time t; Date d; t.call(d); system("PAUSE"); return EXIT_SUCCESS; } |
1.3關於類的提前引用聲明
class Date; //對Date類的提前引用聲明 … void call(Date &);//Date類的引用 … class Date{…}//Date類的聲明 |
class Date; //緊接著馬上定義一個Date類的對象 Date d1;error:aggregate `Date d1' has incomplete type and cannot be defined … class Date{…} |
1.4將一個函式聲明為多個類的友元函式
class Date; //對Date類的提前引用聲明 class Time{ public: Time(int=1,int=1,int=1); friendvoid call(Time&,Date&);//聲明函式call為本類的友元成員函式 private: int hour; int min; int sec; }; class Date{ public: Date(int=1,int=1,int=2008); friendvoid call(Time&,Date&); //聲明函式call為本類的友元成員函式 private: int year; int mon; int day; }; Time::Time(int h,int m,int s){ hour=h; min=m; sec=s; } Date::Date(int m,int d,int y){ mon=m; day=d; year=y; } void call(Time &t,Date &d) { cout<<"TIME:"<<t.hour<<"-"<<t.min<<"-"<<t.sec<<endl; cout<<"DATE:"<<d.mon<<"-"<<d.day<<"-"<<d.year<<endl; } int main(){ Time t; Date d; call(t,d); system("PAUSE"); return EXIT_SUCCESS; } |
友元類
class Date; //對Date類的提前引用聲明 class Time{ public: Time(int=1,int=1,int=1); friendclass Date;//將Date類聲明為當前類的友元類 private: int hour; int min; int sec; }; class Date{ public: Date(int=1,int=1,int=2008); void call_hour(Time&); void call_min(Time&); void call_sec(Time&); private: int year; int mon; int day; }; Time::Time(int h,int m,int s){ hour=h; min=m; sec=s; } Date::Date(int m,int d,int y){ mon=m; day=d; year=y; } void Date::call_hour(Time &t){ cout<<"HOUR:"<<t.hour<<endl; } void Date::call_min(Time &t){ cout<<"MINUTE:"<<t.min<<endl; } void Date::call_sec(Time &t){ cout<<"SECOND:"<<t.sec<<endl; } int main(){ Time t; Date d; d.call_hour(t); d.call_min(t); d.call_sec(t); system("PAUSE"); return EXIT_SUCCESS; } |