“模板类与友元”那些事(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

相关文章
相关标签/搜索