ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

类模板与友元

2021-12-22 15:03:39  阅读:102  来源: 互联网

标签:友元 函数 void template class 模板


01 函数、类、类的成员函数作为类模板的友元
代码例子如下:

// 普通函数
void Func1() { } 

// 普通类
class A { }; 

// 普通类
class B 
{
    public:
    void Func() { } // 成员函数
};

// 类模板
template <class T>
class Tmp
{
    friend void Func1();    // 友元函数
    friend class A;         // 友元类
    friend void B::Func();  // 友元类的成员函数
}; // 任何从 Tmp 实例化来的类 ,都有以上三个友元

02 函数模板作为类模板的友元

// 类模板
template <class T1,class T2>
class Pair
{
private:
    T1 key;   //关键字
    T2 value; //值
public:
    Pair(T1 k,T2 v):key(k),value(v) { };

    // 友元函数模板
    template <class T3,class T4>
    friend ostream & operator<< (ostream & o, const Pair<T3,T4> & p);
};

// 函数模板
template <class T3,class T4>
ostream & operator<< (ostream & o, const Pair<T3,T4> & p)
{
    o << "(" << p.key << "," << p.value << ")" ;
    return o;
}

int main()
{
    Pair<string,int> student("Tom",29);
    Pair<int,double> obj(12,3.14);

    cout << student << " " << obj;
    return 0;
}

输出结果:

(Tom,29) (12,3.14)

03 函数模板作为类的友元

// 普通类
class A
{
private:
    int v;
public:
    A(int n):v(n) { }

    template <class T>
    friend void Print(const T & p); // 函数模板
};

// 函数模板
template <class T>
void Print(const T & p)
{
    cout << p.v;
}

int main() 
{
    A a(4);
    Print(a);
    return 0;
}

输出结果:

4

04 类模板作为类模板的友元

// 类模板
template <class T>
class B 
{
private:
    T v;
public:
    B(T n):v(n) { }

    template <class T2>
    friend class A; // 友元类模板
};

// 类模板
template <class T>
class A 
{
public:
    void Func( )  
    {
        B<int> o(10); // 实例化B模板类
        cout << o.v << endl;
    }
};

int main()
{
    A<double> a;
    a.Func ();
    return 0;
}

输出结果:

10

标签:友元,函数,void,template,class,模板
来源: https://blog.csdn.net/qq_45662588/article/details/122085900

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有