1. 程式人生 > >C++之友元函數和友元類

C++之友元函數和友元類

res con 形參 display tle private 一點 second main

通過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++之友元函數和友元類