C++之友元函數和友元類
通過friend關鍵字,我們可以將不屬於當前類的一個函數在當前類中加以聲明,該函數便可以成為當前類的友元函數。
#include<iostream>
using namespace std;
class book
{
public:
book()
{
cout <<this->price << endl; //這裏是沒有賦值的成員變量就使用,這是不可取的
cout << this->title << endl;
}
book(char* a, double p);
friend void display(book &b);
private:
double price;
char * title;
};
book::book(char* a, double p)
{
title = a;
price = p;
}
void display(book &b)
{
cout<<"The price of "<<b.title<<" is $"<<b.price<<endl;
}
int main()
{
book Hello;
display(Hello);
book Alice("Alice in Wonderland",29.9);
display(Alice);
book Harry("Harry potter", 49.9);
display(Harry);
return 0;
}
// result :6.95314e-310
在我們知道能用友元函數能訪問類中的私有變量,還有一點要記住,沒有初始化的成員變量不能使用,會使程序崩潰。
在本例中,display是一個頂層函數,在book類中,我們借助friend關鍵字將其聲明為友元函數,結果,在display函數體內,我們就能訪問private屬性的title和price成員變量。這就是友元函數的作用。友元函數可以訪問這個類中的私有成員。如果這個display函數不是book類的友元函數,則在函數體中還必須調用public屬性的成員函數。在此例中需要註意的是友元函數的形參是類對象的引用,同時在訪問私有成員變量時必須要加上對象名。
除了頂層函數可以被定義為友元函數之外,其它類的成員函數同樣可以聲明為本類的友元函數,如例2所示。
例 2
#include<iostream>
using namespace std;
class time;
class date
{
public:
date(int y,int m,int d);
void display(time &t);
private:
int year;
int month;
int day;
};
class time
{
public:
time(int s,int m,int h);
friend void date::display(time & t);
private:
int second;
int minute;
int hour;
};
time::time(int s,int m,int h)
{
second = s;
minute = m;
hour = h;
}
date::date(int y,int m,int d)
{
year = y;
month = m;
day = d;
}
void date::display(time &t)
{
cout<<"The time is:"<<endl;
cout<<year<<"/"<<month<<"/"<<day<<" ";
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
}
int main()
{
date d(2015,1,16);
time t(20,2,30);
d.display(t);
return 0;
}
C++之友元函數和友元類