「模板類與友元」那些事(C++)

模版類就是類模版實例化以後的類,友元就是一種對函數訪問權限的控制,經過將函數設爲友元函數讓其可以訪問其餘外部函數不能訪問的"private"成員變量。微信

       接着咱們介紹一個他們結合在一塊兒會產生什麼樣的結果,他們的結合分爲三種狀況:函數

        一、模板類的非模板友元函數學習

        該友元函數的特色是:測試

        A)當該友元函數不使用類模版中的成員變量時,與通常的友元函數沒有區別:spa

        B)當該友元函數使用類模版中的成員變量時,必須爲每個基本類型定義一個友元函數,好比show<int> 和 show<double>.這兩個並非函數的重定義,屬於函數重載。.net

   測試代碼以下:code

1blog

2ci

3get

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

template<typename T>

class Base{

public:

    Base(T x, T y): x(x), y(y){}

    friend void print();

    friend void show(Base<T> &a);

private:

    T x;

    T y;

};

void show(Base<int> &a)

{

    cout << "x = " << a.x << ", y = " << a.y << endl;

}

void show(Base<double> &a)

{

     cout << "x = " << a.x << ", y = " << a.y << endl;

}

void print(){

    cout << "hello, world" << endl;

}

int main()

{

    Base<int> ai(99, 999);

    Base<double> ad(99.99, 200.88);

    print();

    show(ai);

    show(ad);

    return 0;

}

        二、模板類的約束友元函數

            該友元函數的特色是:每個類的具體化與友元的具體化要匹配,也就是說,int類具體化得到一個int類的友元函數,double類就具體化會得到一個double函數,int類具體化不可能得到double類函數;

           要定義一個約束模板友元函數分三步:

        A)在定義類以前聲明友元函數模板;

        B)在類中聲明該友元函數模板;

        C)定義友元函數,

         注意,定義友元函數時形參列表中的」T「表明,具體化以後的類,並非類的模板參數,也就是假如具體化一個模板類」A<int>「, 」T「表明」A<int>「, 並非」int「;經過這種方式來約束該友元函數屬於某個具體化以後的模板。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

template<typename T>void print(); // 第一步:在類定義以前生命函數模板

template<typename T>void show(T &t);

  

template<typename T>

class Base{

public:

    Base(T x, T y): x(x), y(y){}

    friend void print<T>();  // 第二步:在類中聲明友元函數模板

    friend void show<>(Base<T>& a);

private:

    T x;

    T y;

};

//第三步:定義友元函數

void print()

{

    cout << "hello, friend function template" << endl;

}

template<typename T>

void show(T &a)  // 這裏的T表明一個具體化以後的類

{

    cout << "x = " << a.x << ", y = " << a.y << endl;

}

int main()

{

    Base<int> a(99, 999);

    print();

    show(a);

    return 0;

}

        三、模板類的非約束友元函數

    該友元函數的特色與約束友元函數相反:也就是每一個類的具體化都會得到每一個函數的具體化,假如具體化一個int類,在該類中仍然能夠得到一個double、string、int等類的友元函數。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

template<typename T>

class Base{

public:

    Base(T x, T y): x(x), y(y){}

    template<typename D>

    friend void print(Base<D> &obj);

private:

    T x;

    T y;

};

template<typename D>

void print(Base<D> &obj){

    cout << "x = " << obj.x << ", y = " << obj.y << endl;

}

int main()

{

    Base<int> a(99, 999);

    print(a);

    return 0;

}

 

免費學習更多精品課程,登陸樂搏學院官網http://www.learnbo.com/

或關注咱們的官方微博微信,還有更多驚喜哦~

 

本文出自 「11219885」 博客,請務必保留此出處http://11229885.blog.51cto.com/11219885/1791770

相關文章
相關標籤/搜索