C++:友元的必要性和實現範例

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;
}

但是虛數類中成員變量reim是私有的,外部函數無法訪問。

思路2add定義爲成員函數

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:額外定義getset函數:這樣做的壞處是太麻煩了,沒必要。

由此引出,友元函數是這種情況下一個可取的選擇。

問題的解決:友元函數

應用方法:依然把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;
}

其他待補

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章