C++:友元的必要性和實現範例
給小朋友講課的時候用的幾個例子,比較粗淺,可供參考。
友元函數的必要性
問題的提出
考慮一個虛數類:
class Img
{
private:
double re;
double im;
public:
Img() {}
Img(double r, double i) { re = r, im = i; }
};
我們希望定義一個加法函數,實現兩個虛數的相加。產生如下思路:
思路1:定義一個外部add
函數
Img add(Img img1,Img img2)
{
double sum_re = img1.re + img2.re;
double sum_im = img1.im + img2.im;
Img img_sum(sum_re, sum_im);
return img_sum;
}
但是虛數類中成員變量re
和im
是私有的,外部函數無法訪問。
思路2:add
定義爲成員函數
Img Img :: add(Img img1,Img img2)
{
double sum_re = img1.re + img2.re;
double sum_im = img1.im + img2.im;
Img img_sum(sum_re, sum_im);
return img_sum;
}
這樣做的壞處是,只有實例化一個虛數對象之後,才能用這個函數。但這個函數跟這個實體對象並沒有關係,如果要這麼做很牽強。
思路3:定義爲靜態函數:這樣做的壞處是沒必要。沒必要把這兩個成員定義爲static
,會產生額外的問題。
思路4:額外定義get
和set
函數:這樣做的壞處是太麻煩了,沒必要。
由此引出,友元函數是這種情況下一個可取的選擇。
問題的解決:友元函數
應用方法:依然把add
定義爲外部函數,但在類中聲明爲友元函數:
class Img
{
private:
double re;
double im;
public:
Img() {}
Img(double r, double i) { re = r, im = i; }
friend Img add(Img img1, Img img2);
};
這樣在調用這個外部函數的時候就可以直接訪問私有成員。
友元類的必要性
- 當一個外部函數中有訪問另一個類的私有變量需求時,可以在被訪問的類中把訪問它的函數聲明爲友元函數。
- 當一個類的成員函數中有訪問另一個類的私有變量的需求時,可以在被訪問的類中把訪問它的類聲明爲友元類。
一些例子
複數類:完整代碼
#include <iostream>
using namespace std;
class Img
{
private:
double re;
double im;
public:
Img() {}
Img(double r, double i) { re = r, im = i; }
friend Img add(Img img1, Img img2);
void display() { cout << "(" << re << ", " << im << ")" << endl; }
};
Img add(Img img1,Img img2)
{
double sum_re = img1.re + img2.re;
double sum_im = img1.im + img2.im;
Img img_sum(sum_re, sum_im);
return img_sum;
}
int main()
{
Img num1(3, 4);
Img num2(4, 5);
Img a = add(num1, num2);
num1.display();
num2.display();
a.display();
return 0;
}